我有一个 UICollectionViewController,其中包含一堆单元格,每个单元格都有屏幕尺寸。
如果我在竖屏或横屏模式下启动应用程序,一切都按预期工作。
问题出现在当我更改屏幕方向,并调用 collectionViewLayout.invalidateLayout()
后,单元格大小仍保持不变,没有进行调整大小。
我不知道为什么会发生这种情况。
以下是一些代码:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
print("size for item")
return CGSize(width: view.frame.width, height: view.frame.height)
}
override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
coordinator.animate(alongsideTransition: { (_) in
self.collectionViewLayout.invalidateLayout() // layout update
}, completion: nil)
}
在第一次加载时,我从设置的大小获取打印输出,但在更改方向后,它不会调用它,因此当我更改方向时,单元格的大小不适合屏幕,就像在启动时适合一样。
有什么想法可能导致这种情况或者我在这里做错了什么吗?
谢谢
编辑
不知何故,我尝试在willTransition函数中插入一个print语句,并注意到它不会在屏幕旋转时触发。我认为问题应该不是invaldateLayout()而是在那里。因为它从来没有触发过。
这个覆盖函数怎么可能不被自动调用呢?
shouldInvalidateLayout(forBoundsChange newBounds: CGRect)
结合使用。 - Husam