UICollectionViewCell 和 UIScrollView
Posted
技术标签:
【中文标题】UICollectionViewCell 和 UIScrollView【英文标题】:UICollectionViewCell and UIScrollView 【发布时间】:2013-05-21 13:38:46 【问题描述】:我在 UICollectionViewCell 中遇到了 UIScrollView 的奇怪行为。在我的项目中,我有一个 collectionView,每个单元格都有一个 UIScrollView,其中包含 1 个或多个图像。以下是针对此问题的一些示例代码:
- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath
CustomCollectionCell * cell = [cv dequeueReusableCellWithReuseIdentifier:@"CustomCell" forIndexPath:indexPath];
UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(20, 20, 150, 150)];
imageView.image = [UIImage imageNamed:@"someImage.png"];
[cell.scrollView addSubview:imageView];
return cell;
当然,在我的项目中,它不是同一个图像,而是从数据库提供的不同图像。
第一个收集单元添加没有问题。当我添加第二个单元格时,scrollView 似乎会复制自身并将其自身的另一个实例放在顶部。我知道这听起来很奇怪,但您可以在下图中看到它的外观:
请注意左侧 scrollView 中的图像如何变暗,我认为这是因为 scrollView 被复制了。
所以,我猜测该单元格以错误的方式或其他方式重复使用。
感谢您的帮助!
【问题讨论】:
【参考方案1】:每次调用collectionView: cellForItemAtIndexPath:
时,都会将新的UIImageView
添加到重用单元格中。为了解决这个问题,在自定义UICollectionViewCell
中,实现prepareForReuse
方法。在该方法中,删除图像视图。
为此,您可以在图像视图上设置一个标签。例如:
(UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath
CustomCollectionCell * cell = [cv dequeueReusableCellWithReuseIdentifier:@"CustomCell" forIndexPath:indexPath];
UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(20, 20, 150, 150)];
imageView.image = [UIImage imageNamed:@"someImage.png"];
[cell.scrollView addSubview:imageView];
// The following line of code is new
cell.contentView.tag = 100;
return cell;
要从单元格中删除图像视图,请在自定义单元格中添加/更新prepareForReuse
方法:
-(void)prepareForReuse
UIView *myImageView = [self.contentView viewWithTag:100];
[myImageView removeFromSuperview];
【讨论】:
好吧,问题的固定部分,它不会重复,但是现在我注意到另一个奇怪的问题。如果我通过在一个单元格的滚动视图中滑动来更改内容偏移量,则内容偏移量会传递到下一个单元格,而前一个单元格可能会获得新的内容偏移量(即 x=0,y=0)。 这有点难以解释,因为我不太明白这种行为的原因,抱歉:) 据我了解,每次添加新单元格时都会更新整个 collectionView。当单元格添加了滚动视图时,这会导致非常奇怪的结果。我以为只有新单元格被修改了,但我看到所有单元格都被重用了 @SergeyCatraniuc - 建议您接受上述答案 ;-),然后创建一个显示UIScrollView
代码的新问题
我的问题没有得到完全回答,但是我想我会放弃 UIScrollView 并找到使用 UIImageView 的解决方法。感谢您的帮助以上是关于UICollectionViewCell 和 UIScrollView的主要内容,如果未能解决你的问题,请参考以下文章
具有动态高度的 UICollectionViewCell 使用 NSURL 进行图像下载
滚动时大型 UICollectionViewCell 停止显示
基于UILabel的UICollectionViewCell AutoLayout动态高度
如何确定何时显示 UICollectionViewCell?