将应用程序移至后台,调用 viewDidLayoutSubView 并使用 UICollectionView 创建大量警告

use*_*951 0 ipad ios viewdidlayoutsubviews

这一切都是从许多关于 collectionView 单元格宽度的警告开始的,每次我按主页按钮时都会写入控制台。

我认为这是细胞大小的问题并尝试修复它。仅经过一些测试,我注意到 viewDidLayoutView 被调用时使用了错误的 view.bounds,这使得 collectionView 单元格(宽度)比 collection view 更大。

目前,我的解决方法是检查应用程序是否处于后台状态并忽略 viewDidLayoutView。

  1. 为什么它只发生在 iPad 上而不是 iPhone 上?
  2. 令人惊讶的是,直到现在我才看到这一切发生。这是 iOS 中的新东西吗?
  3. 处理这个问题的正确方法是什么?我不使用自动布局
  4. 它的调用边界错误,我不想计算所有单元格框架只是为了用户返回到相同的方向。
  5. 我觉得我在这里遗漏了一些非常基本的东西,或者 iOS 上有一些我不知道的变化。

mat*_*att 5

为什么它只发生在 iPad 上而不是 iPhone 上?

因为当您单击 iPad 上的“主页”并且应用程序进入后台时,运行时会拍摄两张快照,每个方向一张,以便在应用程序切换器界面中使用(并为应用程序返回前台时做好准备)。这意味着它必须旋转应用程序,这会触发布局,因此您的viewDidLayoutSubviews被调用。

令人惊讶的是,直到现在我才看到这一切发生。这是 iOS 中的新东西吗?处理这个问题的正确方法是什么?我不使用错误边界的自动布局调用,并且我不想计算所有单元格框架只是为了用户返回到相同的方向。我觉得我错过了一些非常基本的东西,或者 iOS 上有一些我不知道的变化。

嗯,iPad 的这种行为已经有很长一段时间了。我的工作不是解释为什么你没有注意到。基本上你不应该在viewDidLayoutSubviews.

目前,我的解决方法是检查应用程序是否处于后台状态并忽略 viewDidLayoutView

这是完全合理的。我也做同样的事情。例如(这是一种不同的方法,但它是相同的想法):

override func viewWillTransition(to size: CGSize, with tc: UIViewControllerTransitionCoordinator) {
    if UIApplication.shared.applicationState == .background {
        return
    }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

但请注意,如果您正在执行手动布局,并且在应用程序进入后台时没有执行此操作,则您的应用程序切换器快照可能看起来错误。另外,您没有使用自动布局这一事实是一个危险信号。你可能应该使用它。