2012-11-19 86 views
14

我在Storyboard(iPad)中定义了一个包含UICollectionView的视图,在视图的底部还有一个UIToolbar。 在UICollectionView中,我添加了一个UICollectionViewCell(由iPadCellCollectionViewCell类实现),其中包含另一个视图,即Core-Plot图(CPTGraphHostingView类)。UICollectionView的单元格在滚动后并不总是被刷新

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

在类X,我建立我的视图的每个单元(在ViewDidLoad)核心-散点图和我有以下代码到图形链接到的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; 

}小区

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

我已经找到了解决办法,而不是在Interface Builder中UICollectionViewCell加入CPTGraphHostingView,我建立它自己和以前的代码变成:

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

}

有了这个代码一切工作正常。有没有任何解释为什么当我用IB添加CPTGraphHostingViewUICollectionViewCell时它不起作用?

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

回答

3

这似乎使用sectionInsets时处于UICollectionView的错误。 单元格不会隐藏,它们在快速滚动时有时会出错。

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

如果您将UICollectionView设置为不剪裁到边界,并将其移动到UI的顶部 ,则可能会看到此未对齐的单元。

我的解决方案到目前为止不使用sectionInsets,并通过使用contentInset和节头中的一些空白空间来包围它。

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

+0

我在哪里查看错误报告? – bandejapaisa

9

我也有过类似的问题。我通过在我的自定义内容上调用setFrame:时强制重绘来修复它。

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

编辑:在你的情况下,子类CPTGraphHostingView和覆盖此方法更简单的方法来刷新细胞意见时,他们被重用是覆盖applyLayoutAttributes:iPadCellCollectionViewCell如下:

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

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

+2

我在水平滚动时出现错误位置的单元格时出现同样的问题,但不幸的是,这两个修补程序都不适用于我。 –

+0

伟大的,尝试了两种方法,都工作。 – anka

+0

感谢第二个选项为我工作 – slik

相关问题