我在故事板(iPad)中定义了一个包含UICollectionView
的视图,在视图的底部还有一个UIToolbar
。
在UICollectionView
中,我添加了UICollectionViewCell
(由iPadCellCollectionViewCell
类实现),其中包含另一个视图,即核心图表(CPTGraphHostingView
类)。< / p>
我有一个名为X的类,它实现了UICollectionViewDelegate
和UICollectionViewDataSource
。
在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”是一个问题吗?没有内存泄漏?
答案 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