在所有子视图都已自动布局之前调用viewWillTransitionToSize

时间:2015-12-16 15:41:53

标签: ios swift uiview uiviewcontroller autolayout

我有一个视图层次结构,其视图层次结构位于两个嵌套视图中,这些视图使用自动布局约束放置。 然后我将代码中的一些UIViews放入其中一个视图中,但我不想对这些视图使用约束,因为用户可以拖动它们。

如果设备被旋转,或者用户使用iPad的滑动功能拆分视图,我想根据父视图的自动布局将这些UIViews的位置重置到新位置:

layout of views

我在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注册哪些功能,只有在根据更新的约束布置了所有视图后才会调用它?

1 个答案:

答案 0 :(得分:1)

总是发一个问题让我得到了正确的答案。

在问题视图中,您可以覆盖layoutSubviews例程,这可以从关注点的分离中获得非常好的效果。只有问题视图需要知道如何布局自己的子视图。

override func layoutSubviews() {
    super.layoutSubviews()
    self.resetAnswerTilePositions()
}