collectionViewLayout值切换引发崩溃

最近在做阅读书架更改布局的功能。
遇到莫名其妙的崩溃数次。

需求描述:根据用户切换按钮,调整书架是列表模式(tableView单行,每行一个单元)还是网格模式(collectionView一行多列)。
所以会根据用户的选择,设置collectionViewLayout。

1.刚开始代码如下
self.collectionView.collectionViewLayout = layout;
[self.collectionView reloadData];

但是这样iOS11一下会直接崩,崩溃点在self.collectionView.collectionViewLayout = layout;后调用layoutAttributes相关修改api上,解决方式,调换位置。
[self.collectionView reloadData];
self.collectionView.collectionViewLayout = layout;

2.iOS9在切换的时候还会崩,报错 index out of bounds
应该是CollectioView缓存layout相关元素信息导致,解决方式
[self.collectionView reloadData];
[self.collectionView.collectionViewLayout invalidateLayout];
[self.collectionView layoutIfNeeded];
self.collectionView.collectionViewLayout = layout;

3.这样的切换,会影响一些cell的UI子控件刷新
解决方式,可以考虑把当前visibleCell在设置新的layout后再reload一次

[self.collectionView reloadData];
[self.collectionView.collectionViewLayout invalidateLayout];
[self.collectionView layoutIfNeeded];
self.collectionView.collectionViewLayout = layout;

///强制刷新visible cell

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

}];

你可能感兴趣的:(collectionViewLayout值切换引发崩溃)