【问题标题】:viewWillTransitionToSize called before all subviews have auto-laid-out在所有子视图自动布局之前调用 viewWillTransitionToSize
【发布时间】: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


    【解决方案1】:

    一如既往地发布问题会引导我找到正确的答案。

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

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

    【讨论】:

      猜你喜欢
      • 2015-06-28
      • 2013-12-24
      • 1970-01-01
      • 1970-01-01
      • 2017-07-13
      • 1970-01-01
      • 1970-01-01
      • 2018-07-22
      • 1970-01-01
      相关资源
      最近更新 更多