iphone – 是否可以使用AutoLayout与UITableView的tableHeaderView?

iphone – 是否可以使用AutoLayout与UITableView的tableHeaderView?,第1张

概述因为我发现AutoLayout我无处不在使用它,现在我试图使用它与tableHeaderView。 我做了一个UIView的子类添加了一切(标签等…)我想与他们的约束,然后我添加这个CustomView到UITableView’tableHeaderView。 一切都工作正常,除了UITableView总是显示在CustomView之上,通过上面我的意思是CustomView是在UITableVi 因为我发现autoLayout我无处不在使用它,现在我试图使用它与tableheaderVIEw。

我做了一个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?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1087940.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存