我有一个在视图控制器中以编程方式创建的表视图:
/// 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
}
这里的一切看起来都很好:
然后,我旋转设备并且分隔符不跨越表格视图的宽度另外,当我滚动表格视图时,顶部单元格在到达导航栏之前被切断:
旋转回肖像后,桌面视图看起来更高,导致顶部细胞被切断:
我尝试使用以下方法使用不同的解决方案,例如重新配置coordinator
动画内部的约束,但我无法弄清楚如何使其正常工作:
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
}
我试图弄清楚如何使用这种方法,但我想我并不是真的理解它。
如何使用我的表格视图配置自动布局,以便在旋转设备时其大小和位置适当?
为了回应Aerows的回答,在实施提议的解决方案后,我仍然得到了奇怪的结果:
人像:
风景:
按照Aerow的建议,我使用topLayoutGuide.bottomAnchor
来解决我的问题。
答案 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
处理cells
和tableView
的原因。尝试将separators
或insets
的背景颜色设置为实体,然后查看是否展开整个tableView
。
这是我运行以验证这一点的完整代码。
cell