屏幕旋转不同步时旋转 UIView

Posted

技术标签:

【中文标题】屏幕旋转不同步时旋转 UIView【英文标题】:Rotating UIViews when screen rotates out of sync 【发布时间】:2016-02-21 12:06:12 【问题描述】:

当屏幕旋转时,我在让 UIViews 正确旋转时遇到问题。我正在重置 viewWillLayoutSubviews 中各种元素的框架:

override func viewWillLayoutSubviews() 

    super.viewWillLayoutSubviews()
    //This a transparent black overlay
    cutterView.frame = view.frame
    scrollView.center = view.center

    label.frame.origin = CGPoint(x: cutterView.frame.size.width/2 - label.frame.size.width/2, y: 10)
    okButton.frame.origin = CGPoint(x: cutterView.frame.size.width - okButton.frame.size.width - 12, y: 5)
    backButton.frame.origin = CGPoint(x: 10, y: -7)


UIScrollView 的 clipToBounds 设置为 false。当面向横向时,我的内容比屏幕高。我有一个覆盖整个视图的黑色透明 UIView (cutterView)。然而,旋转是有效的,因为 UIScrollView 的内容非常高,它的顶部和底部不会被覆盖层覆盖,直到覆盖层赶上并旋转以覆盖整个视图。有什么解决方法可以解决这个问题吗?我可以稍微延迟滚动视图的旋转吗?任何指针将不胜感激。谢谢!

【问题讨论】:

viewWillLayoutSubviews 不是协调动画与旋转的正确位置。 最好的地方在哪里?是否可以为 UIDeviceOrientationDidChangeNotification 注册通知并在那里进行? 实现 viewWillTransitionToSize:withTransitionCoordinator: 并使用转换协调器。这就是它的用途,因此您可以协调过渡。 @matt 谢谢队友。只是调查了一下,让它工作了。 酷!我会把我的 cmets 变成一个答案,这样我们就可以完成这个故事。 【参考方案1】:

问题在于viewWillLayoutSubviews 不是协调动画与旋转的正确位置。相反,实现viewWillTransitionToSize:withTransitionCoordinator: 并使用它为您提供的转换协调器。这就是它的用途,因此您可以协调您的动画与 transition

【讨论】:

以上是关于屏幕旋转不同步时旋转 UIView的主要内容,如果未能解决你的问题,请参考以下文章

处理屏幕旋转

UICollectionView 不会在屏幕旋转时更新其布局

快速禁用xib的屏幕旋转

自定义UIView如何处理屏幕旋转

屏幕旋转的编程约束(swift)

当屏幕在同一个视图控制器中旋转时替换 UIViews