在第一次加载时,sizeForItemAt中的UICollectionView大小是错误的 - 在旋转之后它起作用

时间:2017-09-12 22:14:15

标签: ios uicollectionview

我有一个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???
}

1 个答案:

答案 0 :(得分:2)

发生这种情况是因为UICollectionView中的单元格在视图控制器的布局完成之前已加载。

使用约束和集合视图时,我注意到在viewDidAppear(:)调用之前使用集合视图大小是不可靠的。

如果您想要相对于屏幕尺寸进行网格布局,可以使用UIScreen.main.bounds.size方法中的sizeForItemAt

此处,您的集合视图似乎是UIView子类的子视图。因此,如果您不能或不想使用屏幕大小,您还可以在其超视图边界更改后重新加载集合视图:

override var bounds: CGRect {
        didSet {
            if oldValue != bounds {
                self.collectionView?.reloadData()
            }
        }
}