35

を使用してアプリにギャラリーがありUICollectionViewます。セルは約 70,70 サイズです。リストに保存したギャラリーALAssetsから使用しています。ALAssetLibrary

セルにデータを入力するための通常のパターンを使用しています。

-(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 prepareForReusedequeueReusableCellWithReuseIdentifierはこれを見つけることができなかった器具を使用していました.

これを引き起こしている可能性のある他のものはありますか?UICollectionViewCellまたはより高速な方法でそれらを準備する「より高速な」方法はありdequeueますか?

4

6 に答える 6

98

したがって、スクロールの問題を抱えている人は誰でもこれを行う必要があります

デキューの後にこれらの2行を追加します

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

誰かが 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 に答える
0

UICollectionViewスクロールに問題がありました。

私にとって (ほとんど) 魅力的だったのは、セルに 90x90 の png サムネイルを設定したことです。ほとんどの場合、最初の完全なスクロールはそれほどスムーズではありませんが、クラッシュすることはありません...

私の場合、セル サイズは 90x90 です。

以前は多くの元の png サイズがありましたが、png の元のサイズが ~1000x1000 を超えると非常に不安定でした (最初のスクロールで多くのクラッシュが発生しました)。

そこで、 で 90x90 (など) を選択しUICollectionView、元の png を (サイズに関係なく) 表示します。これが他の人に役立つことを願っています。

于 2013-12-21T00:29:45.270 に答える