我正在尝试制作类似于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毫秒)。
因此,在那些时候,UI应该像黄油一样平滑,但事实并非如此。
我甚至试图将常规contents
的{{1}}设置为UIView
。我尝试过iOS 6.0的CGImage
,这似乎让它变得更糟。
我做错了什么?
我已将我的示例项目推送到GitHub:
答案 0 :(得分:0)
我会为辛勤工作(照片加载或解码)创建一个后台线程,当它完成时,然后使用工具(队列,消息等)将UI工作(绘制或其他)委托给主线程。