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

时间:2019-07-09 12:33:31

标签: ios ipad viewdidlayoutsubviews

所有这些都是从关于collectionView单元格宽度的许多警告开始的, 每当我按下主屏幕按钮时,该内容就会写入控制台。

我认为这与细胞大小有关,并试图对其进行修复。 仅在进行一些测试之后,我才注意到viewDidLayoutView是用错误的view.bounds调用的,这使collectionView单元比宽度更大(在宽度上)。

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

  1. 为什么仅在iPad上而不在iPhone上发生?
  2. 很遗憾,直到现在我才看到这种情况。这是iOS中的新功能吗?
  3. 什么是正确的处理方式?我不使用自动版式
  4. 其调用范围错误,我不想只为用户返回相同方向而计算所有单元格帧。
  5. 我好像在这里缺少一些非常基本的东西,或者我不知道iOS上的一些变化。

1 个答案:

答案 0 :(得分:1)

  

为什么仅在iPad上而不在iPhone上发生?

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

  

直到现在我才看到这种情况。这是iOS的新功能吗?   处理此问题的正确方法是什么?我不使用自动版式   它的调用范围错误,我不想只为用户返回同一方向而计算所有单元格的帧。   我进食就像我在这里缺少一些非常基本的东西,或者我不知道iOS上的某些更改一样。

很长一段时间以来,iPad的行为一直如此。解释为什么您没有注意到我不是我的工作。基本上,您不应该在viewDidLayoutSubviews中做任何耗时的事情。

  

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

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

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

但是请注意,如果您正在执行手动布局,并且当应用程序进入后台时没有执行该操作,则您的App Switcher快照可能看起来不正确。同样,您没有使用自动布局的事实也是一个危险信号。您可能应该使用它。