具有自动布局的表标题视图

请给我代码!

我一直在寻找如何在表格标题视图中使用自动布局。 设置表视图的tableHeaderView感觉就像将视图扔在一个黑洞中。 我们不知道它与层次结构中其他视图的关系。

最终,我找到了一种无需使用显式框架即可对我有效的解决方案。

注意:我将UIViewController和UITableView用作子视图,而不是UITableViewController。

要点: 1)设置表标题视图,2)将标题视图的centerX,width和top锚固定到表视图, 3)在表标题视图上调用layoutIfNeeded以更新其大小,4)*再次设置表视图标题。

脚步

viewDidLoad()

  1. 进行容器视图。 在此处添加所有内容。 确保正确设置约束以使其根据需要增长。
  2. 将tableHeaderView设置为容器
  3. 容器(现在为tableHeaderView)到表格视图的centerX,宽度和顶部锚点。
  4. 通过调用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()需要知道正确的父帧:

 覆写func viewWillTransition(大小为CGSize,搭配协调器:UIViewControllerTransitionCoordinator){ 
  super.viewWillTransition(to:size,with:coordinator) 
  DispatchQueue.main.async { 
self.tableView.tableHeaderView?.layoutIfNeeded()
self.tableView.tableHeaderView = self.tableView.tableHeaderView
}
}

Github回购

下面的存储库具有针对这4个步骤的UITableView扩展。 它还包含工作示例,包括UITableView和UITableViewController。

aunnnn / TableHeaderViewWithAutoLayout
TableHeaderViewWithAutoLayout –如何在表标题视图中使用自动布局的示例。 github.com