我正在使用UICollectionViewFlowLayout
的子類並使用其itemSize
屬性來指定單元格大小(而不是collectionView:sizeForItemAtIndexPath:
委託方法)。每當我將屏幕旋轉到較短寬度時(例如風景 - >人像),我都會得到這個巨大的警告。
我能夠通過執行2個步驟來修復它。
步驟1:在UICollectionViewFlowLayout
子類的prepareLayout()
功能,移動super.prepareLayout()
到其中self.itemSize
被設定之後。我認爲這使得超類使用正確的itemSize
值。
import UIKit
extension UICollectionViewFlowLayout {
var collectionViewWidthWithoutInsets: CGFloat {
get {
guard let collectionView = self.collectionView else { return 0 }
let collectionViewSize = collectionView.bounds.size
let widthWithoutInsets = collectionViewSize.width
- self.sectionInset.left - self.sectionInset.right
- collectionView.contentInset.left - collectionView.contentInset.right
return widthWithoutInsets
}
}
}
class StickyHeaderCollectionViewLayout: UICollectionViewFlowLayout {
// MARK: - Variables
let cellAspectRatio: CGFloat = 3/1
// MARK: - Layout
override func prepareLayout() {
self.scrollDirection = .Vertical
self.minimumInteritemSpacing = 1
self.minimumLineSpacing = 1
self.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: self.minimumLineSpacing, right: 0)
let collectionViewWidth = self.collectionView?.bounds.size.width ?? 0
self.headerReferenceSize = CGSize(width: collectionViewWidth, height: 40)
// cell size
let itemWidth = collectionViewWidthWithoutInsets
self.itemSize = CGSize(width: itemWidth, height: itemWidth/cellAspectRatio)
// Note: call super last if we set itemSize
super.prepareLayout()
}
// ...
}
請注意,上述更改將在屏幕旋轉停止工作時以某種方式使佈局大小發生更改。這就是第2步進來
步驟2:在視圖控制器保持所述集合視圖將這個。
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
collectionView.collectionViewLayout.invalidateLayout()
}
現在警告了:)
問題解決了嗎? –
nope,未解決 –