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()时,约束可以自动更新.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...