我正在尝试制作一个类似于 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
常规设置UIView
为CGImage
. 我已经尝试过 iOS 6.0 drawsAsynchronously
,但这似乎让它变得更糟了。
我究竟做错了什么?
编辑:
我已将示例项目推送到 GitHub: