滚动时 UICollectionView 的滞后
Posted
技术标签:
【中文标题】滚动时 UICollectionView 的滞后【英文标题】:Lag in UICollectionView on Scroll 【发布时间】:2015-09-24 07:32:40 【问题描述】:我使用UICollectionView
显示存储在NSMutableArray
中的一些图像
这是我的 cellForItemAtIndexPath 代码
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
CollectionViewCell *cell = (CollectionViewCell*)[collectionView dequeueReusableCellWithReuseIdentifier:@"CollectionViewCell" forIndexPath:indexPath];
if (indexPath.row<self.bookMarksArray.count)
cell.bookmarkImage.image = [self.bookMarksimages objectAtIndex:indexPath.row];
cell.bookmarkTitle.text =[self.bookMarkNames objectAtIndex:indexPath.row];
else
UIImage *bookMarkImage=[UIImage imageNamed:@"emptyCell.png"];
cell.bookmarkImage.image = bookMarkImage;
cell.bookmarkTitle.text =@"";
cell.removeBtn.enabled = NO;
cell.delegate = self;
return cell;
我在数组 self.bookMarksImages 中最多有 32 个项目,当我滚动收藏视图时,我可以注意到滚动有延迟(仅第一次)。
但是当我换行时 cell.bookmarkImage.image = [self.bookMarksimages objectAtIndex:indexPath.row];
带有静态图片 cell.bookmarkImage.image = [UIImage imageNamed:@"emptyCell.png"];
我可以看到滚动没有延迟,我的收藏视图滚动顺畅。
这是我的书签图像初始化代码。
-(void)getAllBookmarkImages
self.bookMarksimages = [[NSMutableArray alloc] init];
self.bookMarkNames = [[NSMutableArray alloc] init];
NSArray *bookMarksArray = [BookMarks getBookMarks];
for (int i=0; i<self.bookMarksArray.count; i++)
NSDictionary *bookmarkInfo = [bookMarksArray objectAtIndex:i];
UIImage *bookMarkImage=[UIImage imageWithContentsOfFile:[BookMarks documentsPathForFileName:[bookmarkInfo objectForKey:@"IMAGE"]]];
[self.bookMarksimages addObject:bookMarkImage];
[self.bookMarkNames addObject:[bookmarkInfo objectForKey:@"TITLE"]];
为什么数组self.bookMarksimages
会导致延迟?
【问题讨论】:
你能在你创建bookMarksimages
数组的地方添加代码吗?
@joern 请检查我的代码,我已经更新了。
【参考方案1】:
造成这个问题的因素有很多
1.图片大小
2.图像位置
解决方法是在图像路径的帮助下将图像加载到异步线程中。制作图像路径数组,而不是图像
- (void) loadImageFromPath:(NSString*)path
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL), ^
NSData *data= [NSData dataWithContentsOfFile:path];
UIImage *theImage=[UIImage imageWithData:data];
dispatch_async(dispatch_get_main_queue(), ^
cell.bookmarkImage.imagee=theImage;
);
);
用法
[cell loadImageFromFile:[self.bookMarksimages objectAtIndex:index]];
【讨论】:
使用你的解决方案,我在每一个滚动上都面临滞后,之前它只是在第一次滚动上。 你在数组中保存了什么? 我将图像路径保存在数组中并使用了您的解决方案,在我的自定义单元格中添加了方法 loadImagesForPath 并替换了您的行 cell.bookmarkImage.imagee=theImage;与 Self.bookmarkImage.image=theImage; der 一定是缺少了它不可能 @walinaqvi 图片尺寸太大而无法放入 UICollectionView 以平滑滚动的可能性更大。最好将其缩小到每张图片小于 50kb。以上是关于滚动时 UICollectionView 的滞后的主要内容,如果未能解决你的问题,请参考以下文章
Objective C uiCollectionView 滚动和加载图像让它感觉滞后
UICollectionViewCell 中的 UICollectionView 滚动缓慢/滞后
UICollectionView 滚动 SWIFT 滞后/缓慢