我有一个视图层次结构,其视图层次结构位于两个嵌套视图中,这些视图使用自动布局约束放置。 然后我将代码中的一些UIViews放入其中一个视图中,但我不想对这些视图使用约束,因为用户可以拖动它们。
如果设备被旋转,或者用户使用iPad的滑动功能拆分视图,我想根据父视图的自动布局将这些UIViews的位置重置到新位置:
我在questionView中有一个名为resetAnswerPosition()的函数,它在自动布局定位启动后根据引用视图的位置正确定位所有视图.CourseView存储了对ReferenceView的引用,这更容易。
文档建议使用viewWillTransitionToSize& willTransitionToTraitCollection运行这些用于旋转的更改,或者当幻灯片将宽高比从横向更改为纵向或再次返回时。但是在iPad Pro上将分割从2/3更改为1/2时,纵横比不会改变,在调整参考视图大小之前调用resetAnswerTilesPositions。
我还尝试过使用viewDidLayoutSubViews,但是再次遇到在调整Reference视图大小之前运行它的问题。
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注册哪些功能,只有在根据更新的约束布置了所有视图后才会调用它?
答案 0 :(得分:1)
总是发一个问题让我得到了正确的答案。
在问题视图中,您可以覆盖layoutSubviews例程,这可以从关注点的分离中获得非常好的效果。只有问题视图需要知道如何布局自己的子视图。
override func layoutSubviews() {
super.layoutSubviews()
self.resetAnswerTilePositions()
}