CollectionView单元格最初看起来太小,然后跳到正确的大小

时间:2018-10-16 14:01:27

标签: ios swift uicollectionview

背景

我正在基于UICollectionView构建的iOS应用中创建日历。每个月都有一个部分,然后是每天一个单元。我的日历视图是在xib中定义的,然后使用init方法中的以下代码加载到我的自定义类中:

Bundle.main.loadNibNamed("CalendarView", owner: self, options: nil)
addSubview(contentView)

contentView.frame = self.bounds
contentView.autoresizingMask = [.flexibleWidth, .flexibleHeight]

我覆盖的布局子视图方法如下:

override func layoutSubviews() {
    super.layoutSubviews()

    collectionView.layoutIfNeeded()
    layout.invalidateLayout() //My subclass of UICollectionViewFlowLayout
}

我正在调整单元格的大小,以便使用UICollectionViewDelegateFlowLayout中的以下方法在一行中始终有7个:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let width = (collectionView.bounds.width - 1) / 7.0
    return CGSize(width: width, height: min(width, 48))
}

单元格也在单独的xib文件中定义。


问题

当包含的视图控制器加载时,单元格都太小,然后在大约1秒钟后它们会捕捉到正确的大小。仅在首次加载时会发生这种情况,宽度在旋转后或在iPad多任务模式下调整应用程序大小后正确。


我尝试过的

以下任何一项均无效。

  • 配置单元格后呼叫layoutSubviews()
  • 更改xib文件中的UICollectionView单元格大小
  • 在布局对象上设置估算的商品尺寸属性

1 个答案:

答案 0 :(得分:0)

如果您正在使用动态尺寸调整单元格,则应在FlowLayout中添加estimatedItemSize

if let flowLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {    
    flowLayout.estimatedItemSize = CGSize(width: flowLayout.itemSize.width, height: flowLayout.itemSize.height)                                                     
}

参考:关于自动调整单元格here的大小的文章。