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

Posted

技术标签:

【中文标题】在所有子视图自动布局之前调用 viewWillTransitionToSize【英文标题】:viewWillTransitionToSize called before all subviews have auto-laid-out 【发布时间】: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 注册哪些函数,只有在所有视图都根据更新的约束布局后才会调用?

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于在所有子视图自动布局之前调用 viewWillTransitionToSize的主要内容,如果未能解决你的问题,请参考以下文章

自动布局和子视图

iOS - 尝试在 layoutSubviews 中的子视图上设置自动布局

在视图出现在屏幕上之前进行转换时,自动布局错误地定位子视图

使用自动布局在 UIScrollView 中使用浮动视图滚动犹豫

UIView 子视图自动布局问题

“隐藏”具有自动布局子视图的 UIView