我有一个 collectionView 设置如下,但在 sizeForItemAt 中 collectionView!.frame.size 与渲染结果不同。
注意:我只对 collectionView 的布局使用约束。
有什么想法吗?
public override init(frame: CGRect){
super.init(frame: frame)
self.translatesAutoresizingMaskIntoConstraints = false
let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
layout.minimumInteritemSpacing = 0
layout.minimumLineSpacing = 0
layout.scrollDirection = .vertical
self.collectionView = UICollectionView(frame: self.frame, collectionViewLayout: layout)
self.addSubview(self.collectionView!)
self.collectionView?.translatesAutoresizingMaskIntoConstraints = false
self.collectionView!.delegate = self
self.collectionView!.dataSource = self
self.collectionView!.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "cellIdentifier")
}
public func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAt indexPath: IndexPath) -> CGSize {
collectionView!.frame.size // Tot the size of the rendered collectionView, and therefore unable to give the cell the right size???
}
Best Answer-推荐答案 strong>
这是因为 UICollectionView 中的单元格在 View Controller 的布局完成之前加载。
在使用约束和 Collection View 时,我注意到在 viewDidAppear( 调用之前使用 Collection View 大小是不可靠的。
如果你想做一个相对于屏幕尺寸的网格布局,你可以在sizeForItemAt 方法中使用UIScreen.main.bounds.size 。
在这里,您的 Collection View 似乎是 UIView 子类的 subview 。因此,如果您不能或不想使用屏幕尺寸,您还可以在其 super View 边界更改后重新加载 Collection View :
override var bounds: CGRect {
didSet {
if oldValue != bounds {
self.collectionView?.reloadData()
}
}
}
关于ios - 首次加载时 UICollectionView 的 sizeForItemAt 大小错误 - 旋转后它可以工作,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/46186086/
|