UICollectionView 单元格中的 UIActivityIndicator 随机不会隐藏
Posted
技术标签:
【中文标题】UICollectionView 单元格中的 UIActivityIndicator 随机不会隐藏【英文标题】:UIActivityIndicator in a UICollectionView cell randomly won't hide 【发布时间】:2013-10-27 00:55:15 【问题描述】:我有一个 UICollectionView,其中 UIActivityIndicator 在加载图像之前显示在单元格中,然后无论 UIImageView+AFNetworking 块中的成功还是失败都会将其关闭。但是,有时我会得到似乎没有隐藏或停止动画的剩余活动指示器。
这是我的 cellForItemAtIndexPath 的一部分:
- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath
...
NSURL *imageURL = [NSURL URLWithString:[tmpcamera objectForKey:@"url"]];
NSURLRequest *imageRequest = [NSURLRequest requestWithURL:imageURL cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:10];
UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
activityIndicator.hidesWhenStopped = YES;
activityIndicator.hidden = NO;
activityIndicator.frame = CGRectMake(0, 0, 130, 110);
activityIndicator.tag = 10;
[cell.imageView addSubview:activityIndicator];
[activityIndicator startAnimating];
__weak typeof(FavouriteCell) *weakImage = cell;
[cell.imageView setImageWithURLRequest:imageRequest
placeholderImage:[UIImage imageNamed:@"trans50.png"]
success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *i)
[activityIndicator stopAnimating];
activityIndicator.hidden = YES;
[activityIndicator removeFromSuperview];
[weakImage.imageView setImage:i];
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error)
[activityIndicator stopAnimating];
activityIndicator.hidden = YES;
[activityIndicator removeFromSuperview];
[weakImage.imageView setImage:[UIImage imageNamed:@"errorimage.png"]];
];
...
我不确定这段代码是否足以调试问题所在,但任何想法都将不胜感激。
我正在谈论的示例截图如下:
【问题讨论】:
【参考方案1】:由于您的单元格可能会在图像请求有机会成功或失败(例如通过滚动)之前被回收/重用,因此您最终可能会在单元格中看到“孤立”活动指示器。
事件顺序:
-
单元格加载,尝试加载图像并启动活动指示器
用户在图像加载之前滚动。细胞被回收。
单元被重复使用。添加了一个新的活动指示器,并且之前的图像加载被中止(因此之前的成功/失败块永远不会被调用)。新旧活动指示器现在都在单元格上,而旧的活动指示器仍在运行。
避免这个问题的一些建议:
-
创建一个包含活动指示器的自定义单元格。
在创建活动指示器时,为指示器的标签属性分配一个数字,然后在重用单元格时通过 viewWithTag: 查找是否已经存在活动指示器。如果已经存在,则使用现有的,否则,创建一个新的。
【讨论】:
谢谢!我认为这是滚动导致的,因为我正在使用 pull 重新加载,并且只有在我快速完成时才会发生。我会试试你的建议。 明确地说,这两个建议是替代方案 - 要么将活动指示器的想法添加到您的单元格,要么使用 tag 属性跟踪现有的活动指示器。 :) 您还可以通过覆盖 UICollectionViewCell 的prepareForReuse
方法进行一些清理工作。如果您遵循 dmercredi 的 #1 建议(我建议),您只需调用 stopAnimating
然后隐藏 activityIndicator。
谢谢你们。我的自定义单元格中确实有一个 UIActivityIndicator 属性,但我无法让它工作。在我最近的尝试中,它似乎正在工作,并且我没有挥之不去的活动指标。非常感谢!以上是关于UICollectionView 单元格中的 UIActivityIndicator 随机不会隐藏的主要内容,如果未能解决你的问题,请参考以下文章
修改 UICollectionView 中特定单元格中的 UIButton
UICollectionView 单元格中的 UIActivityIndicator 随机不会隐藏
如何删除 UICollectionView 单元格中的单个对象?
访问位于设备屏幕中心的 UICollectionView 单元格中的视图