我有如下的collectionView设置,但是在sizeForItemAt
中collectionView!.frame.size
与呈现的结果不同。
注意:我只使用Constraints作为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???
}
最佳答案
发生这种情况是因为在完成视图控制器的布局之前已加载UICollectionView
中的单元格。
当使用约束和集合视图时,我注意到在viewDidAppear(:)
调用之前使用集合视图大小是不可靠的。
如果要相对于屏幕大小进行网格布局,可以在UIScreen.main.bounds.size
方法中使用sizeForItemAt
。
在这里,您的集合视图似乎是UIView
子类的子视图。因此,如果您不能使用屏幕尺寸,也可以在更改其视图范围后重新加载集合视图:
override var bounds: CGRect {
didSet {
if oldValue != bounds {
self.collectionView?.reloadData()
}
}
}
关于ios - UICollectionView大小在第一次加载时在sizeForItemAt中是错误的-旋转后可以工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46186086/