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

moving app to background, calls viewDidLayoutSubView and create a lot of warnings with UICollectionView

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

我认为这是与单元格大小有关的问题并尝试修复它。 只有在一些测试之后,我才注意到 viewDidLayoutView 被错误地调用 view.bounds,这使得 collectionView 单元格比集合视图更大(宽度)。

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

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

why it's happen only in iPad and not on iPhone ?

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

it's whirred that only now I saw this happening. it's something new in iOS ? what is the right way to handle this ? I don't use auto-layout its calling with wrong bounds and I don't want to calculate all cells frames just for the user to return to the same orientation. I feed like I'm missing something very basic here OR there is some change on iOS that I'm not aware.

好吧,iPads 这样的行为已经有很长时间了。我的工作不是解释为什么你没有注意到。基本上你不应该在 viewDidLayoutSubviews 中做任何事情 time-consuming。

for now, my fix is to check if app is on background state and ignore viewDidLayoutView

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

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

但是请注意,如果您正在进行手动布局并且在应用程序进入后台时不这样做,您的 App Switcher 快照可能看起来不对。此外,您没有使用自动布局这一事实是一个危险信号。你可能应该使用它。