我在UIViewController中有一个UICollectionView。我还有两种不同的布局,当按下按钮时我会改变它。
我在两个nib文件中创建的两个单元格之间的布局会发生变化。由于这两个单元格做了相同的更改,并且它们的布局只是不同 - 我已经为它们使用了相同的类,这是UICollectionViewCell的子类。
所以,当我的视图加载时,我会注册我的两个单元格,如下所示:
[self.tradeFeedCollectionView registerNib:[UINib nibWithNibName:@"BBItemTableViewCell" bundle:nil] forCellWithReuseIdentifier:@"TableItemCell"];
[self.tradeFeedCollectionView registerNib:[UINib nibWithNibName:@"BBItemGridViewCell" bundle:nil] forCellWithReuseIdentifier:@"GridItemCell"];
这两个布局是UICollectionViewFlowLayout的子类。在布局子类中,我只使用一种方法来设置布局/单元格的大小和间距 - 就像这样:
-(id)init
{
self = [super init];
if (self){
self.itemSize = CGSizeMake(320, 80);
self.minimumLineSpacing = 0.1f;
}
return self;
}
这适用于更改视图时单元格总是正确的大小。
要更改视图,我有一个具有以下代码的UIButton:
[self.tradeFeedCollectionView.collectionViewLayout invalidateLayout];
if (!self.gridLayoutActive){
self.gridLayoutActive = YES;
[self.tradeFeedCollectionView setCollectionViewLayout:self.grideLayout animated:YES];
self.lastLayoutUsed = @"GridLayout";
}
else {
self.gridLayoutActive = NO;
[self.tradeFeedCollectionView setCollectionViewLayout:self.tableViewLayout animated:YES];
self.lastLayoutUsed = @"TableLayOut";
}
使用上面的代码,我得到了一个很好的动画,两个单元格之间的视图发生了变化。
问题
更改视图时,UICollectionView的可见区域会遗留旧单元格,并且未更新为新单元格。细胞实际上已经改变了形状,但旧细胞的视野被遗忘。当我开始滚动时 - 细胞显示正确,所有旧细胞都消失了。
**我尝试了什么**
我发现调用此代码:
[self.collectionView reloadItemsAtIndexPaths:[self.collectionView indexPathsForVisibleItems]];
我改变布局后解决了一点 - 然而,我放松了动画,看起来很奇怪。
答案 0 :(得分:1)
我实际上解决了这个问题:
在此处查看我的问题:Calling setCollectionViewLayout:animated does not reload UICollectionView
我用适合我的解决方案更新了我的问题。