UIScrollView的W /大CATiledLayer +叠加呈现快速(UIScrollView

2019-09-21 18:21发布

我一直在努力的东西星期了(IOS),我似乎无法找出可以接受的解决方案。

要求

  • 显示10000x10000像素的背景图像
  • 缩放和滚动响应
  • 覆盖在上面具有自定义绘制
  • 在覆盖元件是交互(攻丝和突出元件等),并可以片上或关闭。
  • 的iOS 4.0

把它看成是一个虚构的小镇的地理地图,用的道路,线,面和建筑物疯狂的系统之上绘制。 CGPaths的各种阴影的填充混合物,一些图标图像等,这是像谷歌地图应用的更复杂的版本。

我已经试过:


1 -多CATiled层

视图层次:

  • 滚动型
  • - > ContainerView
  • - > TiledView(CATiledLayer 10000x10000)
  • ---> OverlayView的(CATiledLayer 10000x10000)

结果:丢弃从魔法苹果缓存切片左右。 两个CATiledlayers似乎并没有被正确的道路。 更新覆盖并不快。


2 -类别TiledView为OverlayView的

视图层次:

  • 滚动型
  • - > OverlayView的(TiledView的子类CATiledLayer 10000x10000)

结果:服用了太多的时间来呈现为覆盖更新。 更新缓慢地砖


3 -滚动型瓦特/单个容器视图

视图层次:

  • 滚动型
  • - > ContainerView(10000x10000)
  • - > OverlayView的(CALayer的10000x10000)
  • - > TiledView(CATiledLayer 10000x10000)

结果:无法工作,因为OverlayView的占用太多内存。 TileView是很好,因为它是由CATiledLayer支持


4 -使用滚动委托和CTM规模OverlayView的/转化为模拟要大

视图层次:

  • OverlayView的(CALayer的1024×768)
  • 滚动型
  • - > TiledView(CATiledLayer 10000x10000)

结果:我用的是滚动视图代表调整覆盖图的偏移和缩放。 使用这种方法的问题在于drawRect中被称为像100次的速率和覆盖视图不能得出速度不够快,所以它完全落后到1fps。


所以这是我在哪里。 我觉得这最后一种方法是对的,那么,但这需要一些疯狂的工作驯服的drawRect疯狂。 其他的想法是尝试解决在OpenGL的东西。

我去这样做那些我还以为我问这个社会,看看他们会做什么之前/做过面临着类似的要求。

谢谢你的帮助。

Answer 1:

我的建议是在你的滚动视图两种观点。 背景CATiledLayer视图。 第二种观点是一个自定义的UIView的背景鉴于上述坐镇 - 这是你做你的自定义绘制。 该自定义视图应该有一个drawRect:方法,对于现在什么都不做。

所以,你试试这个有没有在你的customView,并确保滚动等是你想要它。 如果问题是在后台视图,你需要解决这个问题。

在这一点上,你的自定义视图开始画的东西。 请注意,你会得到一个矩形中的drawRect更新。 也许你有一千个项目,可能需要重新画了整个画布 - 所以各自具有框架性质,因此可以判断给定电流放大和帧需要绘制的。 你只画那些项目。

这是一般的技术在过去的工作很适合我。

EDIT2:

因此,在设备上运行,我复制了“不能分配”的消息。 所以,计划B.你可以做的是有一个容器视图,其中有两个观点 - 滚动视图和一个新的UIView子类。 滚动视图具有巨大的怪物视图。 子类视图具有帧是完全的UIScrollView帧。

然后,将确保你得到了滚动消息“scrollViewDidScroll:”大概等。

当滚动视图是稳定的,或者你等上面的消息,则自定义UIView子类得到一个消息,说得出,但使用的偏移这是滚动视图contentOffset。

定制类必须做的工作是一样的。 而不是使用其的drawRect原点,它需要这一点,并通过滚动视图的contentOffset抵消它。 现在,当你画,你正在寻找的是在drawRect中通过点的范围对象:RECT通过滚动视图偏移肯定会抵消。



Answer 2:

我drawed基于路径的地图一次,但我没有背景图片,只有路径。 我只使用了一个与drawRect中(无滚动型)查看并实施滚动/呆着变焦。 其中有一些性能问题,尤其是与高分辨率因为它与分配全分辨率imagecontext问题的iPad3。

  • 不要在路径上使用的阴影等等,这会杀了你的表现。
  • 预先计算的路径/对象的所有边界盒,并将其存储在一些订单,让您可以查找可见路径/对象尽可能地快。
  • 使用不同zoomlevels不同详细的pathsets。

但在最后,我认为OpenGL是更好的解决方案。



Answer 3:

老问题,但每个人有这种挣扎也是如此。 你应该用同样的方式滚动被放大2个拼贴视图/,但覆盖观点不应该被后台视图的子视图。 也就是说,你应该有:

  • 滚动型
  • - > ContainerView
  • - > TiledView(CATiledLayer 10000x10000)
  • - > OverlayView的(CATiledLayer 10000x10000)

然后绘制速度,它真的归结到你如何用于叠加做图。 对于每瓦,你应该确保你只绘制其覆盖落在瓦片的边界之外的瓷砖,不是所有其他的东西。



文章来源: UIScrollView w/ Large CATiledLayer + Overlay that renders fast