以编程方式创建的 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 中未调用 didDeselectItemAtIndexPath 函数