繁体   English   中英

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

[英]UIViewController doesn't update view's constraints when the device orientation is changing

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

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

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

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

这是我的问题

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

self.view.layoutIfNeeded()viewDidAppear()我firstViewController的更新,根据当前方向的限制,也没有工作。 这没用,因为我注意到一件事:

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

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

GIF演示:

在此输入图像描述

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

在此输入图像描述

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

发现需要重置collectionview的帧大小。 添加self.collectionview.frame.size = size

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {

    if let layout = self.collectionview.collectionViewLayout as? UICollectionViewFlowLayout {
        let width = (size.width - 30) / 3
        layout.itemSize = CGSize(width:width, height:width)
        self.collectionview.frame.size = size
        layout.invalidateLayout()
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM