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
Post a Comment