【发布时间】:2015-12-16 15:41:53
【问题描述】:
我有一个视图控制器,其视图层次结构位于两个嵌套视图中,并放置有自动布局约束。 然后我在代码中将一些 UIViews 放入其中一个视图中,但我不想对这些视图使用约束,因为用户可以拖动它们。
如果设备旋转,或者用户使用 iPad 的滑动功能拆分视图,我想根据父视图的自动布局将这些 UIView 的位置重置到新位置:
我在 questionView 中有一个名为 resetAnswerPosition() 的函数,它在自动布局定位启动后根据参考视图的位置正确定位所有视图。QuestionView 存储了对 ReferenceView 的引用,以使这更容易。
文档建议使用 viewWillTransitionToSize 和 willTransitionToTraitCollection 来运行这些更改,这些更改适用于旋转,或者当幻灯片将纵横比从横向更改为纵向或再次返回时。但是,在 iPad Pro 上,当将拆分从 2/3 更改为 1/2 时,纵横比不会改变,即在调整参考视图大小之前调用了 resetAnswerTilesPositions。
我也尝试过使用 viewDidLayoutSubViews,但又遇到了在调整参考视图大小之前运行的问题。
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
coordinator.animateAlongsideTransition({ (context) -> Void in
self.questionView.resetAnswerTilePositions()
},
completion: { (context) -> Void in
})
}
override func willTransitionToTraitCollection(newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
self.questionView.resetAnswerTilePositions()
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.questionAnswerView.resetAnswerTilePositions()
}
我可以向 View Controller 或 QuestionView 注册哪些函数,只有在所有视图都根据更新的约束布局后才会调用?
【问题讨论】:
标签: ios swift uiview uiviewcontroller autolayout