这是我的架构:
我不想为PageViewController设置特定的帧大小,所以我在viewDidLoad方法中设置了这几个约束:
pageView!.view.translatesAutoresizingMaskIntoConstraints = false
let views = ["pageView": pageView!.view]
let constH = NSLayoutConstraint.constraintsWithVisualFormat("H:|[pageView]|", options: .AlignAllCenterY, metrics: nil, views: views)
view.addConstraints(constH)
let heightConstant = self.navigationController!.navigationBar.frame.size.height + self.navigationController!.navigationBar.frame.origin.y
let constW = NSLayoutConstraint.constraintsWithVisualFormat("V:|-\(heightConstant)-[pageView]-\(self.tabBarController!.tabBar.frame.height)-|", options: .AlignAllTrailing, metrics: nil, views: views)
view.addConstraints(constW)
换句话说,顶部填充等于导航栏的高度和底部填充等于标签栏的一个。这在纵向模式下工作得很好。
问题是当我旋转设备时,constW没有重新计算,并且在横向模式下,导航栏和页面顶部之间有一个额外的空间导航,因为导航栏的大小没有变化检测
我发现的唯一解决方法是删除viewDidLayoutSubviews中的constH约束,并将其添加回来。但我认为我错过了一些东西,因为它没有遵循" 自动布局"概念