首页 > 解决方案 > CollectionView 单元格最初看起来太小,然后跳转到正确的大小

问题描述

背景

我正在我的 iOS 应用程序中创建一个日历,它是围绕UICollectionView. 每个月都有一个部分,然后每天有一个单元格。我的日历视图在 中定义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
}

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

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 多任务模式下调整应用程序大小后宽度正确。


我试过的

以下事情都没有奏效。

标签: iosswiftuicollectionview

解决方案


如果您使用的是动态尺寸单元格,则应estimatedItemSize在 FlowLayout 中添加。

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

参考:有关自动调整单元大小的文章附在此处


推荐阅读