35

我的应用程序中有一个画廊,使用UICollectionView. 细胞大小约为 70,70。我ALAssetsALAssetLibrary存储在列表中的画廊中使用。

我正在使用通常的模式来填充单元格:

-(UICollectionViewCell*)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{

  mycell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
  mycell.imageView.image = [[UIImage imageWithCGImage:[alassetList objectAtIndex:indexpath.row] thumbnail]];
  return mycell;
}

我的画廊滚动起伏不定。我不明白为什么会这样。我尝试添加一个 NSCache 来缓存缩略图图像(认为创建图像可能很昂贵),但这对性能没有帮助。

我希望 UI 和股票应用程序一样流畅。

我现在怀疑这可能UICollectionViewCell prepareForReuse是阻碍该dequeueReusableCellWithReuseIdentifier方法的原因,但使用我无法找到的工具。

还有其他可能导致这种情况的原因吗?有没有一种“更快”的方式来以更快的方式准备他们UICollectionViewCelldequeue他们?

4

6 回答 6

98

所以任何有滚动问题的人都应该这样

在你的出队后添加这两行

cell.layer.shouldRasterize = YES;
cell.layer.rasterizationScale = [UIScreen mainScreen].scale;
于 2013-08-27T08:45:58.417 回答
19

我会假设“断断续续”来自 UIImage 分配,而不是任何dequeueReusableCellWithReuseIdentifier方法。我会尝试在后台线程上进行图像分配,看看这是否会让事情变得更有趣。

-(UICollectionViewCell*)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
  mycell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];

  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^(void) {
     // Load image on a non-ui-blocking thread
    UIImage *image = [[UIImage imageWithCGImage:[alassetList objectAtIndex:indexpath.row] thumbnail]];

    dispatch_sync(dispatch_get_main_queue(), ^(void) {
        // Assign image back on the main thread
        mycell.imageView.image = image;
    });
  });

  return mycell;
}

更多细节可以在这里找到:https ://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Multithreading/Introduction/Introduction.html

于 2015-01-18T06:00:01.087 回答
8

使用 NSURLConnection 加载图像sendAsynchronousRequest:queue:completionHandler:

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
    [cell.imageView setImage:[UIImage imageWithData:data]];
}];
于 2014-02-04T09:42:03.907 回答
1

在属性检查器中勾选剪辑子视图和不透明,并勾选启用分页。

于 2015-10-27T05:45:45.203 回答
0

UICollectionView我在滚动时遇到了问题。

什么对我来说(几乎)像一个魅力:我用 90x90 的 png 缩略图填充了单元格。我说几乎是因为第一个完整的滚动不是那么顺利,但再也没有崩溃过......

在我的例子中,单元格大小是 90x90。

我之前有很多原始 png 大小,当 png 原始大小大于 ~1000x1000 时,它非常不稳定(第一次滚动时很多崩溃)。

所以我选择90x90(或类似的)UICollectionView并显示原始png(无论大小)。希望这对其他人有帮助。

于 2013-12-21T00:29:45.270 回答
0

如果有人在使用 PhImageManager,关闭同步可以解决问题。(deliveryMode = .FastFormat 还可以提供额外的性能增强,但权衡是缩略图的质量会降低)

    let option = PHImageRequestOptions()
    option.deliveryMode = .Opportunistic
    option.synchronous = false
    PHImageManager().requestImageForAsset(phAsset, targetSize: CGSizeMake(2048, 2048), contentMode: .AspectFit, options: option, resultHandler: { (image, objects) in
        self.imageView.image = image!
    })
于 2016-11-17T17:06:24.183 回答