使用自动布局处理UITableView旋转

时间:2016-09-13 22:36:51

标签: autolayout ios-autolayout

我有一个在视图控制器中以编程方式创建的表视图:

/// Configures the table view used to display systems.
private func configureTableView() {
    guard let navigationBarHeight = navigationController?.navigationBar.frame.height else { fatalError("Invalid height for navigation bar") }
    let statusBarHeight = UIApplication.shared.statusBarFrame.height
    let totalHeight = navigationBarHeight + statusBarHeight
    view.insertSubview(tableView, aboveSubview: noSystemsLabel)
    tableView.translatesAutoresizingMaskIntoConstraints = false
    tableView.topAnchor.constraint(equalTo: view.topAnchor, constant: totalHeight).isActive = true
    tableView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
    tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
    tableView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
}

这里的一切看起来都很好:

enter image description here

然后,我旋转设备并且分隔符不跨越表格视图的宽度另外,当我滚动表格视图时,顶部单元格在到达导航栏之前被切断:

enter image description here

旋转回肖像后,桌面视图看起来更高,导致顶部细胞被切断:

enter image description here

我尝试使用以下方法使用不同的解决方案,例如重新配置coordinator动画内部的约束,但我无法弄清楚如何使其正常工作:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)
}

我试图弄清楚如何使用这种方法,但我想我并不是真的理解它。

如何使用我的表格视图配置自动布局,以便在旋转设备时其大小和位置适当?

更新

为了回应Aerows的回答,在实施提议的解决方案后,我仍然得到了奇怪的结果:

人像:

enter image description here

风景:

enter image description here

更新 - 工作解决方案

按照Aerow的建议,我使用topLayoutGuide.bottomAnchor来解决我的问题。

1 个答案:

答案 0 :(得分:1)

尝试将top constraint的{​​{1}}设置为tableView的{​​{1}}。

topLayoutGuide

原因是您在view中设置的tableView.topAnchor.constraintEqualToAnchor(topLayoutGuide.bottomAnchor).active = true 正好在纵向模式,但在横向模式中的高度是状态栏不一样(constant而不是top constraint)。

如果自动处理示例中的0.f,则20.f将始终位于可见navigationBar的顶部。

至于topLayoutGuide,这可能是由于view处理cellstableView的原因。尝试将separatorsinsets的背景颜色设置为实体,然后查看是否展开整个tableView

这是我运行以验证这一点的完整代码。

cell