更改流布局的itemSize后,单元格大小未更新

Jor*_*n H 3 ios uicollectionview uicollectionviewcell uicollectionviewlayout

在我的应用程序中,我有一个全屏的分页集合视图,每个单元也需要全屏显示,因此集合视图布局的项目大小必须与视图控制器的视图边界大小相同。为此,viewDidLayoutSubviews我只是设置项目大小,并且它按预期工作。当我显示此屏幕时,它viewDidLayoutSubviews被调用3次,并且每次iPhone 7的视图边界尺寸为375.0 x 667.0。该单元的尺寸与预期的相同。

但是,当使用3D Touch窥视和弹出显示此屏幕时,无论是窥视还是弹出,单元格的大小都没有达到预期的大小。viewDidLayoutSubviews被称为4次,具有以下边界大小:

--- peek triggered ---
375.0 x 569.524495677234
375.0 x 569.524495677234
375.0 x 720.821325648415
--- pop triggered ---
375.0 x 667.0
Run Code Online (Sandbox Code Playgroud)

窥视时,集合视图将按预期以全屏方式显示,高度为721,单元格的预期宽度为375,但单元格的高度应为569(当单元格高度为721时)。在弹出时,集合视图的高度将更改达到预期的667,但像元高度仍为569。

我尝试collectionView.layoutIfNeeded()在设置后致电,itemSize但结果是一样的。为什么集合视图不更新此处的单元格大小?

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    print("\(view.bounds.width) x \(view.bounds.height)")

    let boundsSize = CGSize(width: Int(view.bounds.width), height: Int(view.bounds.height))
    let flowLayout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout

    if flowLayout.itemSize != boundsSize {
        flowLayout.itemSize = boundsSize

        collectionView.layoutIfNeeded() //this doens't help
    }
}
Run Code Online (Sandbox Code Playgroud)

ale*_*dap 14

将集合视图的“估计大小”从检查器更改为“无”!以上答案都不适合我。

估计尺寸


小智 7

看来这是UICollectionViewFlowLayout的错误,我必须在invalidateLayout()之前调用prepare()

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()


    guard let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout else
    {
        return
    }

    layout.itemSize = cellSize
    layout.minimumLineSpacing = space
    layout.prepare()  // <-- call prepare before invalidateLayout
    layout.invalidateLayout()
}
Run Code Online (Sandbox Code Playgroud)