14

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

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

在 X 类中,我为视图的每个单元格(在 中ViewDidLoad)构建了 Core-Plot 图表,并且我有以下代码将图表链接到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 中添加CPTGraphHostingViewUICollectionViewCell我自己构建它,前面的代码变为:

- (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 中添加时它CPTGraphHostingView不起作用UICollectionViewCell

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

4

2 回答 2

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:
}

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

于 2012-11-23T19:25:12.917 回答
3

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

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

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

到目前为止,我的解决方案是不使用 sectionInsets,而是使用 contentInset 和部分标题中的一些空白空间来包围它。

I also found some other guys at Twitter with the same problem. There's also a bug report about it: 12353513

于 2012-11-28T11:29:50.843 回答