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 秒(解压缩和显示),它们的高度为 480 像素。我的“解码”时间(完整图像)约为 0.8 到 1.2 秒。“显示”大约是 0.0001 秒(大约是 0.1 毫秒)。

所以在那个时候,用户界面应该像黄油一样光滑,但事实并非如此。

我什至尝试将contents常规设置UIViewCGImage. 我已经尝试过 iOS 6.0 drawsAsynchronously,但这似乎让它变得更糟了。

我究竟做错了什么?

编辑:

我已将示例项目推送到 GitHub:

https://github.com/lukescott/PhotoScroller

4

1 回答 1

0

我会为艰苦的工作(照片加载或解码)创建一个后台线程,并在完成后使用工具之一(队列、消息等)将 UI 工作(绘图或其他)委托给主线程。

于 2013-01-01T11:32:04.153 回答