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.

  1. copy code ;)
  2. bring tableviewcontroller objects storyboard, in identity inspector set class mytableviewcontroller
  3. extend cell height of desired value (i've set 50), in identity inspector set class mytableviewcell
  4. add 3 labels cell
  5. select 3 labels , add constraints:
    • equal widths
    • equal heights
    • vertical space top: 10
    • vertical space bottom: 10
  6. select left label , set:
    • horizontal space middle label: 10
    • horizontal space left: 10
  7. select right label , set:
    • horizontal space middle label: 10
    • horizontal space right: 10
  8. click on triangle on bottom right , select update frames. should positioned correctly.
  9. select each label, on right panel select attributes inspector, mark correct alignment in there (left left label, middle middle label, right right label).
  10. connect appropriate label label in mytableviewcell iboutlets.

everything should work fine solution.


Comments

Popular posts from this blog

PHP DOM loadHTML() method unusual warning -

python - How to create jsonb index using GIN on SQLAlchemy? -

c# - TransactionScope not rolling back although no complete() is called -