请给我代码!
我一直在寻找如何在表格标题视图中使用自动布局。 设置表视图的tableHeaderView感觉就像将视图扔在一个黑洞中。 我们不知道它与层次结构中其他视图的关系。
最终,我找到了一种无需使用显式框架即可对我有效的解决方案。
注意:我将UIViewController和UITableView用作子视图,而不是UITableViewController。
要点: 1)设置表标题视图,2)将标题视图的centerX,width和top锚固定到表视图, 3)在表标题视图上调用layoutIfNeeded以更新其大小,4)*再次设置表视图标题。
layoutIfNeeded
在viewDidLoad() :
viewDidLoad()
layoutIfNeeded()
就是这样。
// ...在viewDidLoad()中
// 1。 让containerView = UIView() containerView.translatesAutoresizingMaskIntoConstraints = false
// headerView是您的实际内容。 containerView.addSubview(headerView)
// 2。 self.tableView.tableHeaderView = containerView
// 3。 containerView.centerXAnchor.constraint(equalTo:self.tableView.centerXAnchor).isActive = true
containerView.widthAnchor.constraint(equalTo:self.tableView.widthAnchor).isActive = true
containerView.topAnchor.constraint(equalTo:self.tableView.topAnchor).isActive = true
// 4。 self.tableView.tableHeaderView?.layoutIfNeeded() self.tableView.tableHeaderView = self.tableView.tableHeaderView
只需在viewWillTransitionToSize中再次执行步骤4,但是在下一个绘制循环中进行此操作(通过使用Dispatch.main.async包装),因为layoutIfNeed()需要知道正确的父帧:
layoutIfNeed()
覆写func viewWillTransition(大小为CGSize,搭配协调器:UIViewControllerTransitionCoordinator){
super.viewWillTransition(to:size,with:coordinator)
DispatchQueue.main.async { self.tableView.tableHeaderView?.layoutIfNeeded() self.tableView.tableHeaderView = self.tableView.tableHeaderView } }
下面的存储库具有针对这4个步骤的UITableView扩展。 它还包含工作示例,包括UITableView和UITableViewController。
aunnnn / TableHeaderViewWithAutoLayout TableHeaderViewWithAutoLayout –如何在表标题视图中使用自动布局的示例。 github.com