2011-09-06 146 views
4

我一直坚持这个相当长的一段时间。我看过很多其他的答案,也是苹果的例子。在UIScrollView中缩放和滚动大图像

我想知道的是我如何能够在UIScrollView中加载大图片,并且能够通过它们进行页面浏览和放大,如照片应用程序。

我正在研究一个应用程序,我需要滚动浏览大图像(大,我的意思是大于1024 x 1024的图像)。我已经实现了类似于照片应用的功能。但是,现在我正在使用大图片,我得到了内存警告和内容。我知道为什么我会收到警告,并且我知道我需要平铺图像

苹果的例子表明,已经存在的小图像的平铺。我的应用程序将下载多个图像,并将它们保存在磁盘上,用户将能够在稍后看到它们。因此,我不能使用其他程序剪切图像。

我需要的东西,我可以瓷砖全尺寸图像。任何帮助将不胜感激。另外,正如我前面提到的,我知道我必须对Tiling做些什么。不过,我对此并不熟悉,如果答案中包含一些示例代码,我可以将其用作起点,我将不胜感激。

我看了其他问题,似乎没有人回答我的满意,因此,我再次问这个问题。

再次感谢!

回答

3

要使用平铺,您需要在视图中使用CaTiledLayer。谷歌搜索会给你很好的信息。基本上你声明UIVIew正在使用它,为缩放声明一些细节级别,在drawRect中,你将接收每个tile作为rect参数。

平铺图像,在一个UIImage负荷(它使用的内存,但相当不是显示它少),并使用用于每个图块你想要的东西,如:

UIGraphicsBeginImageContextWithOptions(tileSize, YES, 1); 
CGContextRef ctx = UIGraphicsGetCurrentContext(); 
CGContextTranslateCTM(ctx, -tileSize.width * columnNumber, -tileSize.height*rowNumber); 
[img drawInRect:CGRectMake(0, 0, tileSize.width, tileSize.height)]; 
UIImage* imgCut = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

并保存imgCut。如果在CATiledLayer中使用不同级别的细节,您可能会希望生成具有不同缩放的平铺。

+0

非常感谢您的回复。 :)所以,如果我得到这个正确的,我继承一个UIView并传递一个UIImage('img'变量)。假设这个UIView与苹果的PhotoScroller应用中的TilingView相同,那么,如果我把你的代码放到' - (UIImage *)tileForScale:(CGFloat)缩放行中:(int)row col:(int)col' method Apple的PhotoScroller应用程序,我会得到我的图像的平铺版本? – codeBearer

+0

我建议在显示图像之前生成图块并将它们保存在缓存目录中,以便在创建图像后释放大图像,并准备好所有图块。 我不知道这个例子,但它看起来这种方法将返回行,列和缩放适当的瓷砖图像,所以它应该工作 – Luis

+0

所以我需要创建瓷砖(通过切割图像),无论是当我当我要将图像加载到屏幕上时,完成下载图像还是异步完成? – codeBearer