滚动后,UICollectionView的单元格不会始终刷新

时间:2012-11-19 20:32:38

标签: ios uicollectionview uicollectionviewcell cptbarplot

我在故事板(iPad)中定义了一个包含UICollectionView的视图,在视图的底部还有一个UIToolbar。 在UICollectionView中,我添加了UICollectionViewCell(由iPadCellCollectionViewCell类实现),其中包含另一个视图,即核心图表(CPTGraphHostingView类)。< / p>

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

在X类中,我为我的视图的每个单元格(在ViewDidLoad中)构建Core-Plot Graph,并且我有以下代码将图形链接到UICollectionViewCell <的单元格/ p>

- (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;

}

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

我找到了一种解决方法,而不是在Interface Builder中的CPTGraphHostingView中添加UICollectionViewCell,我自己构建它并且之前的代码变为:

- (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”是一个问题吗?没有内存泄漏?

2 个答案:

答案 0 :(得分:9)

我遇到了类似的问题。我通过在我的自定义内容上调用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:
}

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

答案 1 :(得分:3)

使用sectionInsets时,这似乎是UICollectionView中的一个错误。 单元格不会变得不可见,有时在快速滚动时它们会被错误地放在边界之外。

因此,如果您通常每行有3个项目,您将在一行中获得第四项,但在下一行的第一个位置没有项目。

如果您将UICollectionView设置为不剪切到边界,并将其移到UI的顶部, 你可能会看到这个错位的单元格。

到目前为止,我的解决方案是不使用sectionInsets,并使用contentInset和节标题中的一些空格来包围它。

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