微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ios – 当设备方向发生变化时,UIViewController不会更新视图的约束

我正在创建一个可以在横向和纵向模式下使用iPad的应用程序.
我的UIViewControllers的配置如下:

我有一个带有UICollectionView的UIViewController,它有以下约束:top,leading,trailing和bottom设置为0及其superview(superview是我的UIViewController的UIView).

当我点击一个单元格时,我在UINavigationController中推送另一个UIViewController,它是单元格的详细viewController.简单.

当我在第一个视图控制器中更改设备方向时,正确设置了UICollectionView边界.

这是我的问题:

如果我在UICollectionView中选择一个单元格,则会显示第二个详细信息viewController.然后,如果在第二个ViewController中我改变了设备方向,然后我回到第一个viewController,我的UIViewController的视图还没有被旋转.我不知道为什么,我尝试了这个没有成功:

我的firstViewController的viewDidAppear()中的self.view.layoutIfNeeded()根据当前方向更新约束,它不起作用.这没用,因为我注意到一件事:

我的第一个viewController的框架视图仍然与前一个方向相同,它没有改变……但是如果我再次旋转设备,UIViewController会检测方向变化,并正确设置视图边界.

所以我的问题是:当我在第二个视图控制器中,并且我正在旋转设备,然后我回到上一个视图控制器时,之前的控制器没有检测到我刚刚在第二个视图控制器.

GIF演示:

enter image description here

之后,我从纵向模式旋转到横向模式,视图不会更改,因为调试视图层次结构工具显示如下:

enter image description here

UIView仍处于纵向状态,因此无法使用新方向更新UICollectionView约束…

有任何想法吗?

解决方法

通过在viewWillAppear方法中使用屏幕边界重置第一个viewController中的视图框架来解决

public override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(true)
    self.view.frame = UIScreen.main.bounds
    self.view.layoutIfNeeded()
}

就像我的viewController的主要UIView有正确的框架,当我在我的UIView上调用layoutIfNeeded()时,约束可以自动更新.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐