LDOTiledView
使用方法
- 将
LDOTiledView
添加到您的视图层次结构中(您可能希望将其嵌入到一个UIScrollView
中)。 - 设置
maximumZoomLevel
,imageSize
和tileSize
(详情见下文)。 - 实现
LDOTiledViewDataSource
的唯一方法func tiledView(_ tiledView: LDOTiledView, tileForRow row: Int, column: Int, zoomLevel: Int) -> UIImage?
缩放级别与缩放比例
LDOTiledView
的典型用法是能够放大图像。这是通过嵌入到 UIScrollView
中来实现的。然而,UIScrollView.zoomScale
指的是内容大小(作为一个区域),因此是按指数增长的。重复地加倍图像尺寸,缩放比例增长如下:1, 2, 4, 8。
LDOTiledView
使用更直观的缩放级别概念。在其最小的分辨率下,图像处于缩放级别 1。在同一尺寸的两倍大小为级别 2,再次加倍大小为级别 3,依此类推。缩放级别线性增长,并且在每个级别上,图像的大小是上一个级别的两倍。这也适用于瓦片地图(如 Google Maps、OpenStreetMaps 等)。
图像大小
图像尺寸指的是图像在最小缩放级别下的点尺寸。
以下表格阐述了图像尺寸与缩放级别之间的关系。
缩放级别 | 图像尺寸 [pt] | 2x Retina [px] | 3x Retina [px] |
---|---|---|---|
1 | 410 x 890 | 820 x 1780 | 1230 x 2670 |
2 | 820 x 1780 | 1640 x 3560 | 2460 x 5340 |
3 | 1230 x 2670 | 2460 x 5340 | 3690 x 8010 |
4 | 1640 x 3560 | 3280 x 7120 | 4920 x 10680 |
这意味着要在iPhone Xs Max上全屏幕图像进行四倍缩放,你需要一张52兆像素的原始图像。在这个例子中,maximumZoomLevel
会设置为4,而imageSize
会是410 x 890。
瓦片尺寸
CATiledLayer
及其LDOTiledView
背后的基本思想是,不是一次性将一个大图像加载到内存中,而是将图像分割成更小的方块,并且只有当前可见的方块会被加载。这意味着无论图像有多大,任何给定时间都大约会加载相同数量的方块。因此,内存消耗(几乎是)恒定的,与图像尺寸无关。
瓦片尺寸指定了将大图像分割成的小方块的尺寸。它是以点为单位定义的。这意味着如果您将瓦片尺寸设置为256x256,则视网膜瓦片必须是512x512像素。因此,非Retina、Retina和Super Retina图像将被分割成相同数量的瓦片。
瓦片加载
关于底层的CATiledLayer
的一个常见抱怨是,它有时会显示黑色方块而不是图像瓦片。在我们的经验中,这实际上并不是CATiledLayer
的问题,而是由失败的图像加载造成的。有时,如果在调用得太频繁时使用UIImage(named:)
,它将返回nil
。(这可能是由于UIImage(named:)
执行的缓存,以及瓦片加载是异步执行的事实所引起的。)对于我们来说,将图像作为Data
加载并从该数据创建UIImage
工作得非常完美。YMMV。
生成瓦片
虽然对您如何创建图像瓦片没有严格的要求,但我们包含了一个小的Ruby脚本以帮助您开始。它基于libvips,因此如果您想使用它,请确保已安装。
脚本使用最大缩放级别和最高比例(1x/2x/3x)的输入图像。然后它将图像缩小到所有较小缩放级别并缩放。
地球示例的瓷砖是通过以下命令创建的:
$ ./gen_tiles.rb Example/Demo\ Images/Earth/earth.jpg -scale 2 -scale 3 -levels 4
Level 1 image size: 450 x 450
请检查gen_tiles.rb --help
获取更多信息。
示例
要运行示例项目,首先克隆存储库,然后从示例目录运行pod install
。
安装
LDOTiledView可通过CocoaPods获取。要安装它,只需将以下行添加到您的Podfile:
pod 'LDOTiledView'
作者
Raschke & Ludwig GbR, https://www.lurado.com/
许可证
LDOTiledView在MIT许可证下可用。请参阅LICENSE文件以获取更多信息。
致谢
灵感来源于并基于JCTiledScrollView。
示例项目中的地球图像来自NASA地球观测站:Robert Simmon使用NOAA环境可视化实验室的Suomi NPP VIIRS图像创作的NASA地球观测图像。Suomi NPP是NASA、NOAA和国防部之间合作的结果。