UICollectionView在更改布局时显示旧单元格

时间:2014-03-20 12:35:39

标签: ios iphone objective-c uicollectionviewcell uicollectionviewlayout

我在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]];

我改变布局后解决了一点 - 然而,我放松了动画,看起来很奇怪。

1 个答案:

答案 0 :(得分:1)

我实际上解决了这个问题:

在此处查看我的问题:Calling setCollectionViewLayout:animated does not reload UICollectionView

我用适合我的解决方案更新了我的问题。