我给你的 UICollectionView 设置了橙色背景,然后运行你的代码,得到了类似的结果:
我注意到了一些事情
- 由此我可以得出结论,UICollectionView 似乎已设置好并且在旋转时运行良好,可能是由于自动布局,所以我觉得问题更多与布局代码有关。
- 我还注意到,当您开始滚动时,视图会自行修复为您想要的内容
- 最后,我在您的
func relayoutCollectionView(with size: CGSize) 函数中添加了一行代码,以查看您想要更新布局计算和列时的尺寸
func relayoutCollectionView(with size: CGSize) {
collectionView.collectionViewLayout.shouldInvalidateLayout(forBoundsChange: CGRect(x: 0,
y: 0,
width: size.width,
height: size.height))
collectionView.setCollectionViewLayout(createFlowLayout(),
animated: true,
completion: nil)
collectionView.collectionViewLayout.invalidateLayout()
// I added this line
print("Collection View Width: \(collectionView.frame.size.width), Collection View Height: \(collectionView.frame.size.height)")
}
当我从纵向转到横向时,打印的输出是Collection View Width: 810.0, Collection View Height: 1080.0,这似乎不正确。
因此,我认为现在调用 invalidateLayout 以获得正确的计算还为时过早。
当我从 UIViewController 执行类似操作时,我会从 viewWillLayoutSubviews() 调用 invalidateLayout()
在您的情况下,我尝试和工作的是在您的 class CollectionView: UIView 中添加类似的 override func layoutSubviews()
override func layoutSubviews() {
super.layoutSubviews()
collectionView.collectionViewLayout.invalidateLayout()
}
我从您的func relayoutCollectionView 中删除了relayoutCollectionView
现在它似乎也是第一次工作,尽管我仍然无法解释为什么除了第一次之外你的当前工作每隔一次。