我做了一个UIVIEw的子类添加了一切(标签等…)我想与他们的约束,然后我添加这个CustomVIEw到UItableVIEw’tableheaderVIEw。
一切都工作正常,除了UItableVIEw总是显示在CustomVIEw之上,通过上面我的意思是CustomVIEw是在UItableVIEw所以它不能被看到!
看来,无论我做什么,UItableVIEw’tableheaderVIEw的高度总是0(所以是宽度,x和y)。
我的问题:是否有可能完成这一点,而不手动设置框架?
编辑:
我使用的CustomVIEw的视图有这些约束:
_Title = [[UILabel alloc]init]; _Title.text = @"Title"; [self addSubvIEw:_Title]; [_Title keep:[KeeptopInset rules:@[[KeepEqual must:5]]]]; // Title has to stay at least 5 away from the suppervIEw top [_Title keep:[KeepRightInset rules:@[[KeepMin must:5]]]]; [_Title keep:[KeepleftInset rules:@[[KeepMin must:5]]]]; [_Title keep:[KeepBottomInset rules:@[[KeepMin must:5]]]];@H_502_23@我使用一个方便的库“KeepLayout”,因为手动写入约束永远和太多的行一个单一的约束,但方法是自我解释。
而UItableVIEw有这些约束:
_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 the UItableVIEw stays 0 away from the supervIEw top left right and 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;@H_502_23@我不知道如果我必须直接在CustomVIEw上设置一些约束,我认为CustomVIEw的高度是由UILabel“标题”中的约束确定的。
编辑2:经过另一个调查,似乎自定义视图的高度和宽度正确计算,但自定义视图的顶部仍然在同一水平比UItableVIEw的顶部,他们一起移动时,我滚动。
解决方法 我问和回答一个类似的问题 here.总之,我添加头一次,并使用它来找到所需的高度。然后可以将该高度应用于标题,并且第二次设置标题以反映该改变。- (voID)vIEwDIDLoad{ [super vIEwDIDLoad]; self.header = [[SCAMessageVIEw alloc] init]; self.header.TitleLabel.text = @"Warning"; self.header.subTitleLabel.text = @"This is a message with enough text to span multiple lines. This text is set at runtime and might be short or long."; //set the tableheaderVIEw so that the required height can be determined self.tableVIEw.tableheaderVIEw = self.header; [self.header setNeedsLayout]; [self.header layoutIfNeeded]; CGfloat height = [self.header systemLayoutSizefittingSize:UILayoutFittingCompressedSize].height; //update the header's frame and set it again CGRect headerFrame = self.header.frame; headerFrame.size.height = height; self.header.frame = headerFrame; self.tableVIEw.tableheaderVIEw = self.header;}@H_502_23@如果您有多行标签,这也依赖于自定义视图设置每个标签的preferredMaxLayoutWIDth:
- (voID)layoutSubvIEws{ [super layoutSubvIEws]; self.TitleLabel.preferredMaxLayoutWIDth = CGRectGetWIDth(self.TitleLabel.frame); self.subTitleLabel.preferredMaxLayoutWIDth = CGRectGetWIDth(self.subTitleLabel.frame);}@H_502_23@或者更一般地:
overrIDe func layoutSubvIEws() { super.layoutSubvIEws() for vIEw in subvIEws { guard let label = vIEw as? UILabel where label.numberOflines == 0 else { continue } label.preferredMaxLayoutWIDth = CGRectGetWIDth(label.frame) }}@H_502_23@2015年1月更新
不幸的是,这似乎仍然是必要的。这里是一个swift版本的布局过程:
tableVIEw.tableheaderVIEw = headerheader.setNeedsLayout()header.layoutIfNeeded()let height = header.systemLayoutSizefittingSize(UILayoutFittingCompressedSize).heightvar frame = header.frameframe.size.height = heightheader.frame = frametableVIEw.tableheaderVIEw = header@H_502_23@我发现将它移植到UItableVIEw上的扩展很有用:
extension UItableVIEw { //set the tableheaderVIEw so that the required height can be determined,update the header's frame and set it 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 }}@H_502_23@用法:
let header = SCAMessageVIEw()header.TitleLabel.text = "Warning"header.subTitleLabel.text = "Warning message here."tableVIEw.setAndLayouttableheaderVIEw(header)@H_502_23@ 总结以上是内存溢出为你收集整理的iphone – 是否可以使用AutoLayout与UITableView的tableHeaderView?全部内容,希望文章能够帮你解决iphone – 是否可以使用AutoLayout与UITableView的tableHeaderView?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)