0

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レギュラーの設定まで行ってみましUIViewCGImage。私はiOS6.0を試しましたがdrawsAsynchronously、それは少し悪化しているようです。

私は何が間違っているのですか?

編集:

サンプルプロジェクトをGitHubにプッシュしました:

https://github.com/lukescott/PhotoScroller

4

1 に答える 1

0

ハードワーク(写真の読み込みまたはデコード)用のバックグラウンドスレッドを作成し、それが完了したら、ツール(キュー、メッセージなど)のいずれかを使用してUI作業(描画など)をメインスレッドに委任します。

于 2013-01-01T11:32:04.153 に答える