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
})
我最终解决了这个问题,使用具有不同单元标识符的单元原型来满足我需要的每种尺寸,并且效果很好。
在一个 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
})
我最终解决了这个问题,使用具有不同单元标识符的单元原型来满足我需要的每种尺寸,并且效果很好。