UICollectionView的单元格在滚动后并不总是被刷新

我在Storyboard(iPad)中定义了一个包含UICollectionView的视图,在视图底部还有一个UIToolbar 。 在UICollectionView我添加了一个UICollectionViewCell (由一个iPadCellCollectionViewCell类实现),它包含另一个视图,即核心图( CPTGraphHostingView类)。

我有一个名为X的类实现了UICollectionViewDelegateUICollectionViewDataSource

在类X中,我为我的视图(在ViewDidLoad )的每个单元格构buildCore-Plot Graph,并且具有以下代码将图链接到UICollectionViewCell的单元格

 - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { static NSString* cellId = @"ChartCollectionId"; iPadCellCollectionViewCell* cell = [self.theCollectionView dequeueReusableCellWithReuseIdentifier:cellId forIndexPath:indexPath]; MyChart* chart = [_charts objectAtIndex:indexPath.row]; cell.hostingView.hostedGraph = chart.barChart; return cell; 

}

它工作正常,所有我的graphics正确显示在屏幕上。 当用户滚动视图时会发生问题,然后一个或多个单元格变为“空白”。 我真的不明白为什么。

我find了一种解决方法,而不是在界面生成器中的UICollectionViewCell中添加CPTGraphHostingView ,我自己构build它,并且之前的代码变为:

 - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { static NSString* cellId = @"ChartCollectionId"; iPadCellCollectionViewCell* cell = [self.theCollectionView dequeueReusableCellWithReuseIdentifier:cellId forIndexPath:indexPath]; [cell.contentView addSubview:[_hostingViews objectAtIndex:indexPath.row]]; return cell; 

}

有了这个代码,一切工作正常。 有没有任何解释为什么它不工作,当我在CPTGraphHostingView中添加UICollectionViewCell与IB?

每次调用方法时调用“addSubview”是个问题吗? 没有内存泄漏?

这似乎是使用sectionInsets时UICollectionView中的一个错误。 细胞不能看不见,它们在快速滚动时有时会错位。

所以如果你通常每行有3个项目,你会得到一行第四项,但在下一行的第一个地方没有项目。

如果您将UICollectionView设置为不剪切为边界,并将其移至UI的顶部,则可能会看到此未alignment的单元格。

我的解决scheme到目前为止不使用sectionInsets,并通过使用contentInset和部分标题中的一些空白空间将其包围。

我也在Twitter上发现了一些其他人,也有同样的问题。 还有一个关于它的错误报告:12353513

我有类似的问题。 我通过在我的自定义内容上调用setFrame:时强制重绘来修复它。 在你的情况下,子类CPTGraphHostingView并重写此方法:

 -(void)setFrame:(CGRect)frame { [super setFrame:frame]; [self setNeedsDisplay]; // force drawRect: } 

编辑:刷新单元格视图重用时更简单的方法是覆盖applyLayoutAttributes:iPadCellCollectionViewCell ,如下所示:

 -(void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes { // apply custom attributes... [self.hostingView setNeedsDisplay]; // force drawRect: } 

关于你的解决方法:在内容视图中会有越来越多的子视图,这可能不是一件好事。 但是,如果您在添加新的子视图之前删除任何旧的子视图,那也应该是可以的。