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

seb*_*ien 14 ios cptbarplot uicollectionview uicollectionviewcell

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

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

在类X中,我构建了我的视图的每个单元格(在ViewDidLoad)Core-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;
Run Code Online (Sandbox Code Playgroud)

}

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

我已经找到一个解决办法,而不是添加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;
Run Code Online (Sandbox Code Playgroud)

}

使用此代码一切正常.是否有任何解释为什么它不工作的时候我加入了CPTGraphHostingViewUICollectionViewCell与IB?

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

chr*_*ris 9

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

-(void)setFrame:(CGRect)frame {
    [super setFrame:frame];
    [self setNeedsDisplay]; // force drawRect:
}
Run Code Online (Sandbox Code Playgroud)

编辑:一个简单的方法来刷新细胞意见时,他们被重用是覆盖applyLayoutAttributes:iPadCellCollectionViewCell如下:

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

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

  • 当水平滚动时,我在错误的位置渲染单元格时遇到同样的问题,但不幸的是,这两个修复都不适合我. (2认同)

Thy*_*raz 3

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

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

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

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

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