iOSの写真アプリに似た写真スライダーを作ろうとしています。PhotoScrollerを見たことがあり、使用してinitWithContentsOfFile
います。
CATiledLayerは、タイルを事前に生成する方法がないことを除けば、良い考えのようです。タイルも多くのスペースを占めます。画像はiCloudと同期されたドキュメントバンドルの一部です。写真は通常JPEGです。何時間も読んでいると、画像全体をロードするよりも、その場でタイルを生成する方が遅いようです。
とにかく、時間の大部分は画像の解凍に費やされているようです。そして、それをバックグラウンドキューに移動し、小さい画像を表示するとうまくいくはずです。それが私がやろうとしていることです。ある程度は機能しますが、画像が読み込まれるのを待たずにスライドすると、まだ多少のスタッターが発生し、スクロールビューが一時的にハングすることがあります(ページング時)。
これは、画像を設定する関数です。
- (void)setImage:(UIImage *)image placeholder:(UIImage *)placeholder
{
_image = image;
self.zoomScale = 1.0;
imageView.image = nil;
imageSize = image.size;
imageView.frame = CGRectMake(0, 0, image.size.width, image.size.height);
MachTimer *timer = [MachTimer new];
[timer start];
imageView.image = placeholder;
NSLog(@"placeholder: %f", [timer elapsedSeconds]);
//imageView.layer.contents = (id)placeholder.CGImage;
self.contentSize = image.size;
[self setMaxMinZoomScalesForCurrentBounds];
self.zoomScale = self.minimumZoomScale;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
MachTimer *timer = [MachTimer new];
[timer start];
UIGraphicsBeginImageContext(CGSizeMake(1, 1));
[image drawAtPoint:CGPointZero];
UIGraphicsEndImageContext();
NSLog(@"decode: %f", [timer elapsedSeconds]);
dispatch_sync(dispatch_get_main_queue(), ^{
if(_image == image) {
MachTimer *timer = [MachTimer new];
[timer start];
imageView.image = image;
NSLog(@"display: %f", [timer elapsedSeconds]);
//imageView.layer.contents = (id)image.CGImage;
}
});
});
}
私の「プレースホルダー」時間は約0.00005〜0.00006秒(解凍して表示)で、高さは480pxです。私の「デコード」時間(フルイメージの場合)は約0.8〜1.2秒です。「表示」は約0.0001秒(約0.1ミリ秒)です。
そのため、当時のUIはバターのように滑らかであるはずですが、そうではありません。
contents
レギュラーの設定まで行ってみましUIView
たCGImage
。私はiOS6.0を試しましたがdrawsAsynchronously
、それは少し悪化しているようです。
私は何が間違っているのですか?
編集:
サンプルプロジェクトをGitHubにプッシュしました: