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

时间:2014-06-19 13:35:14

标签: scroll uicollectionview overlap

我正在尝试实现一个自定义UICollectionView,它显示资产库中的所有元素。虽然显示这些项目并不是什么大不了的事情,但我遇到了一个奇怪的错误,我认为它必须对我正在使用的布局做些什么。

让我们从一些屏幕截图开始,说明发生了什么。我只是在滚轮上发布这些图像的链接: - )

1。初始

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

一切都好。

2。向下滚动

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

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

第3。再次滚动

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

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

这是一些代码。我希望我没有错过任何相关的东西 - 如果是的话,请告诉我。

MultiImagePickerController.m(:UICollectionViewController,protocols: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 个答案:

答案 0 :(得分:0)

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