以编程方式创建的 UICollectionView:滚动后单元格重叠

Posted

技术标签:

【中文标题】以编程方式创建的 UICollectionView:滚动后单元格重叠【英文标题】:Programmatically created UICollectionView: cells overlap after scrolling 【发布时间】:2014-06-19 13:35:14 【问题描述】:

我正在尝试实现一个自定义 UICollectionView 来显示资产库中的所有元素。虽然显示项目没什么大不了的,但我遇到了一个奇怪的错误,我认为这与我正在使用的布局有关。

让我们从一些屏幕截图开始,以说明发生了什么。我只会发布这些图片的链接,以便在您的滚轮上轻松使用:-)

1.初始

https://dl.dropboxusercontent.com/u/607872/***/01-uicollectionview-start.png

一切正常。

2。向下滚动

https://dl.dropboxusercontent.com/u/607872/***/02-uicollectionview-scrolleddown.png

第一行的图像(不再可见)在最后一行的图像后面重复出现。第一个是不可见的,因为它完全重叠。

3.再次向上滚动

https://dl.dropboxusercontent.com/u/607872/***/03-uicollectionview-scrollup.png

第一张图片(在背景中)来自同一行,但应该是第三张。第 2 和第 3 张图片来自最后一行。

这里有一些代码。我希望我没有遗漏任何相关内容 - 如果有,请告诉我。

MultiImagePickerController.m(:UICollectionViewController,协议:UICollectionViewDataSource,UICollectionViewDelegateFlowLayout)

- (void)loadView 
    [...] // layout stuff
    UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
    [layout setScrollDirection:UICollectionViewScrollDirectionVertical];

    _collectionView = [[UICollectionView alloc] initWithFrame:collectionRect collectionViewLayout:layout];
    [_collectionView setDataSource:self];
    [_collectionView setDelegate:self];
    [_collectionView registerClass:[MultiImagePickerCell class] forCellWithReuseIdentifier:@"MultiImagePickerCellIdentifier"];
    [_collectionView setBackgroundColor:[UIColor whiteColor]];
    [self.view addSubview:_collectionView];


- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
    MultiImagePickerCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MultiImagePickerCellIdentifier" forIndexPath:indexPath];

    if ( !cell ) 
        CGSize sizeCell = [MultiImagePickerCell defaultSize];
        cell = [[MultiImagePickerCell alloc] initWithFrame:CGRectMake( 0, 0, sizeCell.width, sizeCell.height )];
    

    NSString *groupname = [self getKeyFromMutableDictionary:assetList forIndex:indexPath.section];
    [cell addImageUsingAsset:[[assetList objectForKey:groupname] objectAtIndex:indexPath.row]];

    return cell;


- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
    CGSize sizeCell = [MultiImagePickerCell defaultSize];
    return CGSizeMake( sizeCell.width + 10.0, sizeCell.height + 10.0 );

MultiImagePickerCell - (void)addImageUsingAsset:(ALAsset *)asset;

此方法将 UIImageView 和 UIImage 添加到单元格以显示资产。在我看来,没什么特别的。当我在 cellForItemAtIndexPath 中设置断点时,我可以看到从assetList 中读取了正确的资产并且视图计算正确。单元格的drawRect方法没有实现。

我想几年前我尝试以编程方式创建 UITableViewController 时遇到了同样的问题,但我不记得我是如何解决的。

有什么建议吗?

【问题讨论】:

【参考方案1】:

知道了 - 我必须从单元格中删除子视图。

【讨论】:

以上是关于以编程方式创建的 UICollectionView:滚动后单元格重叠的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式创建 UICollectionView

在以编程方式创建的 UICollectionView 中未调用 didDeselectItemAtIndexPath 函数

如何以编程方式创建 UICollectionView

以编程方式创建的 UICollectionView:滚动后单元格重叠

以编程方式将子视图添加到 UICollectionView

你能以编程方式修改 UICollectionView 滚动方向吗?