UICollectionView刷新问题

UICollectionView refreshing issue

在一个 iOS 应用程序中,我有一个 UICollectionView,它有 100(或 80,或 40)个单元格开始。 一开始还好,布局还可以,每个cell的大小也合适,100个就小一点,40个就大

在应用内,用户可以将单元格数量更改为 100(或 80,或 40)。 当数字发生变化时,每个单元格的布局和大小都应相应更改。但是那部分没有按预期工作。

当用户更改单元格数量时,将执行此代码:

myCollectionView.reloadData()
myCollectionView.collectionViewLayout.invalidateLayout()

由于某些原因,有些东西不起作用。我应该在上面的代码中做更多或不同的事情吗? 单元格的数量是正确的,但新闻单元格的大小是乱七八糟的,我对布局(定位)不太确定。

关于UICollectionViewDelegate协议,我只实现了一个方法:

func collectionView(_ collectionView: UICollectionView,
                    didSelectItemAt indexPath: IndexPath) {
    .........
}

对于 UICollectionViewDelegateFlowLayout 协议,我实现了以下内容:

func collectionView(_ collectionView: UICollectionView,
                    layout collectionViewLayout: UICollectionViewLayout,
                    sizeForItemAt indexPath: IndexPath) -> CGSize {
     let cellSide = UIScreen.main.bounds.width * 3 / CGFloat(brain.getSide()! * 4)
    return CGSize(width: cellSide, height: cellSide)
}


func collectionView(_ collectionView: UICollectionView,
                    layout collectionViewLayout: UICollectionViewLayout,
                    minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
    return 6.0
}


func collectionView(_ collectionView: UICollectionView,
                    layout collectionViewLayout: UICollectionViewLayout,
                    minimumLineSpacingForSectionAt section: Int) -> CGFloat {
    return UIScreen.main.bounds.width / (CGFloat(brain.getSide()!) * 4.4)
}

上面的方法似乎在开始时工作正常,给出了足够的值。但是当用户更改设置时,它们甚至似乎都不会被调用。

请试试这个重新加载方法

Objective-c

[self.collectionView performBatchUpdates:^{
                                            [myCollectionView reloadData];
                                          } 
                              completion:^(BOOL finished) {}
];

Swift-3

myCollectionView?.performBatchUpdates({
            myCollectionView.reloadData()
        }, completion: { (result: Bool) in
        })

我最终解决了这个问题,使用具有不同单元标识符的单元原型来满足我需要的每种尺寸,并且效果很好。