iOS   发布时间:2022-03-30  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了iphone – 是否可以使用AutoLayout与UITableView的tableHeaderView?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
因为我发现AutoLayout我无处不在使用它,现在我试图使用它与tableHeaderView。

做了一个UIView的子类添加了一切(标签等…)我想与他们的约束,然后我添加这个CustomView到UITableView’tableHeaderView。

一切都工作正常,除了UITableView总是显示在CustomView之上,通过上面我的意思是CustomView是在UITableView所以它不能被看到!

看来,无论我做什么,UITableView’tableHeaderView的高度总是0(所以是宽度,x和y)。

我的问题:是否有可能完成这一点,而不手动设置框架?

编辑:
我使用的CustomView的视图有这些约束:

@H_419_22@_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]]]];

我使用一个便的库“KeepLayout”,因为手动写入约束永远和太多的行一个单一的约束,但方法是自我解释。

而UITableView有这些约束:

@H_419_22@_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;

我不知道如果我必须直接在CustomView上设置一些约束,我认为CustomView的高度是由UILabel“标题”中的约束确定的。

编辑2:经过另一个调查,似乎自定义视图的高度和宽度正确计算,但自定义视图的顶部仍然在同一水平比UITableView的顶部,他们一起移动时,我滚动。

解决方法

我问和回答一个类似的问题 here.总之,我添加头一次,并使用它来找到所需的高度。然后可以将该高度应用于标题,并且第二次设置标题以反映该改变。

@H_419_22@- (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 deter@L_874_23@d 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; }

如果您有多行标签,这也依赖于自定义视图设置每个标签的preferredMaxLayoutWidth:

@H_419_22@- (void)layoutSubviews { [super layoutSubviews]; self.titleLabel.preferredMaxLayoutWidth = CGRectGetWidth(self.titleLabel.framE); self.subtitleLabel.preferredMaxLayoutWidth = CGRectGetWidth(self.subtitleLabel.framE); }

或者更一般地:

@H_419_22@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) } }

2015年1月更新

不幸的是,这似乎仍然是必要的。这里是一个swift版本的布局过程:

@H_419_22@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

我发现将它移植到UITableView上的扩展很有用:

@H_419_22@extension UITableView { //set the tableHeaderView so that the required height can be deter@L_874_23@d,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_419_22@let header = SCAmessageView() header.titleLabel.text = "Warning" header.subtitleLabel.text = "Warning message here." tableView.setAndLayoutTableHeaderView(header)

大佬总结

以上是大佬教程为你收集整理的iphone – 是否可以使用AutoLayout与UITableView的tableHeaderView?全部内容,希望文章能够帮你解决iphone – 是否可以使用AutoLayout与UITableView的tableHeaderView?所遇到的程序开发问题。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。