【发布时间】:2012-08-22 10:48:34
【问题描述】:
我已经研究了几个星期了(iOS),但我似乎无法找到一个可以接受的解决方案。
要求
- 显示 10000x10000 像素的背景图片
- 缩放和滚动响应
- 具有自定义绘图的顶部叠加层
- 叠加中的元素是交互式的(点击和突出显示元素等),并且可以打开或关闭片段。
- iOS 4.0
把它想象成一个虚构城镇的地理地图,上面绘制了一个由道路、线路、区域和建筑物组成的疯狂系统。 CGPaths 与各种不透明度填充、一些图标图像等的混合。它就像一个更复杂的谷歌地图应用程序版本。
我尝试过的:
1 - 多个 CATiled 层
查看层次结构:
- 滚动视图
- ->容器视图
- -->TiledView (CATiledLayer 10000x10000)
- --->OverlayView (CATiledLayer 10000x10000)
结果: 左右从魔法苹果缓存中掉落瓷砖。两个 CATiledlayers 似乎不是正确的路径。覆盖的更新并不快。
2 - OverlayView 的 TiledView 子类
查看层次结构:
- 滚动视图
- ->OverlayView(TiledView CATiledLayer 10000x10000 的子类)
结果: 渲染覆盖更新的时间太长。 更新瓷砖很慢
3 - 带有单个容器视图的滚动视图
查看层次结构:
- 滚动视图
- ->ContainerView (10000x10000)
- -->OverlayView (CALayer 10000x10000)
- -->TiledView (CATiledLayer 10000x10000)
结果: 无法工作,因为 OverlayView 消耗太多内存。 TileView 很好,因为它有 CATiledLayer 支持
4 - OverlayView 使用滚动代理和 CTM 缩放/平移来模拟变大
查看层次结构:
- OverlayView (CALayer 1024x768)
- 滚动视图
- ->TiledView (CATiledLayer 10000x10000)
结果: 我使用滚动视图代表来调整覆盖视图的偏移和缩放。这种方法的问题在于,drawrect 每秒调用 100 次,而覆盖视图的绘制速度不够快,因此它完全滞后到 1fps。
这就是我所在的位置。我觉得这最后一种方法很重要,但需要一些疯狂的工作来驯服drawrect的疯狂。其他想法是尝试在 OpenGL 中解决一些问题。
在我开始做这些之前,我想我会询问社区,看看他们在面对类似要求时会做什么/做了什么。
感谢您的帮助。
【问题讨论】:
标签: ios uiscrollview catiledlayer