ios - UITableView - Row - Multiple alignments -
i trying make row's contents (in uitableview) have multiple alignments: left, center , right. searched stackoverflow solution , found this: different text alignment row in table view. problem solution objectivec-based, having trouble translating swift-based solution.
specifically, have uitableview representing active users list. loading contents table view works fine, sake of readability contents - divided 3 types - need visually divided 3 different 'sections'. how go doing this? solution above in swift? in advance.
code (for vive)
class declaration
class mainviewcontroller: uiviewcontroller, uitableviewdatasource, uitableviewdelegate
viewdidload()
self.activeids.delegate = self self.activeids.datasource = self self.activeids.rowheight = 25 self.activeids.separatorstyle = uitableviewcellseparatorstyle.none self.activeids.allowsmultipleselection = true
cellforrowatindexpath
func tableview(tableview: uitableview, cellforrowatindexpath indexpath: nsindexpath) -> uitableviewcell{ let cell = activeids.dequeuereusablecellwithidentifier("cellreuseid", forindexpath: indexpath) activeidtableviewcell cell.leftlabel.text = "i go left" cell.middlelabel.text = "i go center" cell.rightlabel.text = "i go right" return cell }
numberofrowsinsection
func tableview(tableview: uitableview, numberofrowsinsection section: int) -> int { return 4 //i randomly chose 4, example }
activeidtableviewcell.swift - pretty copied
import uikit class activeidtableviewcell: uitableviewcell { // alloc & init labels let leftlabel = uilabel() let middlelabel = uilabel() let rightlabel = uilabel() // mark: memory management override init(style: uitableviewcellstyle, reuseidentifier: string?) { // never forget call super in overriden uikit methods (almost never ;)) super.init(style: .default, reuseidentifier: reuseidentifier) // let's assign these values we've set in storyboards leftlabel.textalignment = nstextalignment.left // created label, need add label subview of cells view. contentview.addsubview(leftlabel) middlelabel.textalignment = nstextalignment.center contentview.addsubview(middlelabel) rightlabel.textalignment = nstextalignment.right contentview.addsubview(rightlabel) } required init(coder adecoder: nscoder) { fatalerror("init(coder:) has not been implemented") //xcode points line when error thrown } // mark: layout override func layoutsubviews() { super.layoutsubviews() // here happens magic skips autolayouts. can ofc set autolayouts code :) let frame = self.contentview.bounds // frame size of cell, want set our labels @ least 10px sides of cell - looks nicely let insetframe = cgrectinset(frame, 10.0, 10.0) // width of each label width of cell / 3 (you want 3 labels next each other) minus margins let labelwidth = (cgrectgetwidth(insetframe) - 20.0) / 3.0 // lets calculate rects , assign frames calculated values let leftlabelrect = cgrectmake(cgrectgetminx(insetframe), cgrectgetminy(insetframe), labelwidth, cgrectgetheight(insetframe)) leftlabel.frame = leftlabelrect let middlelabelrect = cgrectmake(cgrectgetmaxx(leftlabelrect), cgrectgetminy(insetframe), labelwidth, cgrectgetheight(insetframe)) middlelabel.frame = middlelabelrect let rightlabelrect = cgrectmake(cgrectgetmaxx(middlelabelrect), cgrectgetminy(insetframe), labelwidth, cgrectgetheight(insetframe)) rightlabel.frame = rightlabelrect }}
i've double checked things cell-identifiers , custom classes correctly set in storyboard.
ok, small tutorial how it, please comments under question according programming best practices:
first file, containing viewcontroller:
class mytableviewcontroller: uitableviewcontroller { // here ofc you'll have array/dictionary of input data let titles = ["ios", "android", "windows phone", "firefox os", "blackberry os", "tizen", "windows mobile", "symbian", "palm os"] // make sure how many rows table should have override func tableview(tableview: uitableview, numberofrowsinsection section: int) -> int { return titles.count } // here dequeue tableviewcells, they're reusable (so table fast & responding // allocating new resources new cell consuming override func tableview(tableview: uitableview, cellforrowatindexpath indexpath: nsindexpath) -> uitableviewcell { let cell: mytableviewcell = tableview.dequeuereusablecellwithidentifier("cellid", forindexpath: indexpath) as! mytableviewcell // fill data cell.rightlabel.text = "i'm right cell" cell.middlelabel.text = titles[indexpath.row] cell.leftlabel.text = "i'm left cell" return cell; } }
and second file cell class:
class mytableviewcell: uitableviewcell { @iboutlet weak var leftlabel: uilabel! @iboutlet weak var middlelabel: uilabel! @iboutlet weak var rightlabel: uilabel! }
and how tell ib :/. personally, prefer code solution, decision.
- copy code ;)
- bring
tableviewcontroller
objects storyboard, inidentity inspector
set classmytableviewcontroller
- extend cell height of desired value (i've set 50), in
identity inspector
set classmytableviewcell
- add 3 labels cell
- select 3 labels , add constraints:
- equal widths
- equal heights
- vertical space top: 10
- vertical space bottom: 10
- select left label , set:
- horizontal space middle label: 10
- horizontal space left: 10
- select right label , set:
- horizontal space middle label: 10
- horizontal space right: 10
- click on triangle on bottom right , select
update frames
. should positioned correctly. - select each label, on right panel select
attributes inspector
, mark correct alignment in there (left left label, middle middle label, right right label). - connect appropriate label label in
mytableviewcell
iboutlets
.
everything should work fine solution.
Comments
Post a Comment