在所有子视图自动布局之前调用 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 中的子视图上设置自动布局