私のアプリケーションにはUICollectionViewがあり、各セルはUIImageViewといくつかのテキストラベルです。問題は、UIImageViewsで画像を表示しているときに、スクロールのパフォーマンスがひどいことです。 UITableViewのスクロールエクスペリエンスやUIImageViewのない同じUICollectionViewのスムーズさにはほど遠いところです。UICollectionViewのスクロールパフォーマンスがUIImageで
私は数ヶ月前からthis questionを見つけました。答えが見つかったようですが、それはRubyMotionで書かれていて、私はそれを理解できません。私はそれをXcodeに変換する方法を見てみましたが、NSCacheを一度も使用していないので、少し難しいです。そこのポスターにも、ソリューションに加えて何かを実装することについてhereが指摘されていましたが、そのコードをどこに入れるかはわかりません。おそらく私はfirst questionのコードを理解していないためです。
誰かがこれをXcodeに翻訳するのに役立つだろうか?私はそれを実現するためにどこか/わからないんだけど、ここでも
UIImage *productImage = [[UIImage alloc] initWithContentsOfFile:path];
CGSize imageSize = productImage.size;
UIGraphicsBeginImageContext(imageSize);
[productImage drawInRect:CGRectMake(0, 0, imageSize.width, imageSize.height)];
productImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
:ここ
def viewDidLoad
...
@images_cache = NSCache.alloc.init
@image_loading_queue = NSOperationQueue.alloc.init
@image_loading_queue.maxConcurrentOperationCount = 3
...
end
def collectionView(collection_view, cellForItemAtIndexPath: index_path)
cell = collection_view.dequeueReusableCellWithReuseIdentifier(CELL_IDENTIFIER, forIndexPath: index_path)
image_path = @image_paths[index_path.row]
if cached_image = @images_cache.objectForKey(image_path)
cell.image = cached_image
else
@operation = NSBlockOperation.blockOperationWithBlock lambda {
@image = UIImage.imageWithContentsOfFile(image_path)
Dispatch::Queue.main.async do
return unless collectionView.indexPathsForVisibleItems.containsObject(index_path)
@images_cache.setObject(@image, forKey: image_path)
cell = collectionView.cellForItemAtIndexPath(index_path)
cell.image = @image
end
}
@image_loading_queue.addOperation(@operation)
end
end
は
first questionのアスカーは、問題を解決し前記
second questionからコードです。
多くのありがとうございます。
コードを投稿してください。何を試しましたか?あなたのアプリのパフォーマンスが遅いのはなぜですか?何が起こっているかを見るためにそれをプロファイリングした結果は何ですか? –
パフォーマンスが低下しているのは私のアプリ全体ではなく、UICollectionView内のセルをスクロールするだけです。アプリケーションの残りの部分はとてもうまく動作します。現在、 'cell.cardImageView.image = [UIImage imageWithData:[NSData dataWithContentsOfFile:tempCard]];'を使って画像を設定しています。使用されている画像はアプリバンドルの一部ではありませんが、通常はダウンロードしてCachesフォルダに保存します。 – Nick