iphone - Is it possible to use AutoLayout with UITableView's tableHeaderView? -


since discovered autolayout use everywhere, i'm trying use tableheaderview.

i made subclass of uiview added (labels etc...) wanted constraints, added customview uitableview'tableheaderview.

everything works fine except uitableview displays above customview, above mean customview under uitableview can't seen !

it seems no matter do, height of uitableview'tableheaderview always 0 (so width, x , y).

my question : possible @ accomplish without setting frame manually ?

edit : customview'subview i'm using has these constraints :

    _title = [[uilabel alloc]init];     _title.text = @"title";     [self addsubview:_title];     [_title keep:[keeptopinset rules:@[[keepequal must:5]]]]; // title has stay @ least 5 away supperview top     [_title keep:[keeprightinset rules:@[[keepmin must:5]]]];     [_title keep:[keepleftinset rules:@[[keepmin must:5]]]];     [_title keep:[keepbottominset rules:@[[keepmin must:5]]]]; 

i'm using handy library 'keeplayout' because writing constraints manually takes forever , way many line 1 single constraint methods self-explaining.

and uitableview has these constraints :

_tableview = [[uitableview alloc]init]; _tableview.translatesautoresizingmaskintoconstraints = no; _tableview.delegate = self; _tableview.datasource = self; _tableview.backgroundcolor = [uicolor clearcolor]; [self.view addsubview:_tableview]; [_tableview keep:[keeptopinset rules:@[[keepequal must:0]]]];// these 4 constraints make uitableview stays 0 away superview top left right , bottom. [_tableview keep:[keepleftinset rules:@[[keepequal must:0]]]]; [_tableview keep:[keeprightinset rules:@[[keepequal must:0]]]]; [_tableview keep:[keepbottominset rules:@[[keepequal must:0]]]];  _detailsview = [[customview alloc]init]; _tableview.tableheaderview = _detailsview; 

i don't know if have set constraints directly on customview, think height of customview determined constraints on uilabel "title" in it.

edit 2: after investigation seems height , width of customview correctly calculated, top of customview still @ same level top of uitableview , move when scroll.

i asked , answered similar question here. in summary, add header once , use find required height. height can applied header, , header set second time reflect change.

- (void)viewdidload {     [super viewdidload];      self.header = [[scamessageview alloc] init];     self.header.titlelabel.text = @"warning";     self.header.subtitlelabel.text = @"this message enough text span multiple lines. text set @ runtime , might short or long.";      //set tableheaderview required height can determined     self.tableview.tableheaderview = self.header;     [self.header setneedslayout];     [self.header layoutifneeded];     cgfloat height = [self.header systemlayoutsizefittingsize:uilayoutfittingcompressedsize].height;      //update header's frame , set again     cgrect headerframe = self.header.frame;     headerframe.size.height = height;     self.header.frame = headerframe;     self.tableview.tableheaderview = self.header; } 

if have multi-line labels, relies on custom view setting preferredmaxlayoutwidth of each label:

- (void)layoutsubviews {     [super layoutsubviews];      self.titlelabel.preferredmaxlayoutwidth = cgrectgetwidth(self.titlelabel.frame);     self.subtitlelabel.preferredmaxlayoutwidth = cgrectgetwidth(self.subtitlelabel.frame); } 

or perhaps more generally:

override func layoutsubviews() {     super.layoutsubviews()       view in subviews {         guard let label = view as? uilabel label.numberoflines == 0 else { continue }         label.preferredmaxlayoutwidth = cgrectgetwidth(label.frame)     } } 

update january 2015

unfortunately still seems necessary. here swift version of layout process:

tableview.tableheaderview = header header.setneedslayout() header.layoutifneeded() let height = header.systemlayoutsizefittingsize(uilayoutfittingcompressedsize).height var frame = header.frame frame.size.height = height header.frame = frame tableview.tableheaderview = header 

i've found useful move extension on uitableview:

extension uitableview {     //set tableheaderview required height can determined, update header's frame , set again     func setandlayouttableheaderview(header: uiview) {         self.tableheaderview = header         header.setneedslayout()         header.layoutifneeded()         let height = header.systemlayoutsizefittingsize(uilayoutfittingcompressedsize).height         var frame = header.frame         frame.size.height = height         header.frame = frame         self.tableheaderview = header     } } 

usage:

let header = scamessageview() header.titlelabel.text = "warning" header.subtitlelabel.text = "warning message here." tableview.setandlayouttableheaderview(header) 

Comments

Popular posts from this blog

linux - xterm copying to CLIPBOARD using copy-selection causes automatic updating of CLIPBOARD upon mouse selection -

c++ - qgraphicsview horizontal scrolling always has a vertical delta -