当使一个由CATiledLayer支持的视图无效时,先前的瓷砖仍然“卡住”,没有被正确地使无效。当在主线程上使视图无效时,似乎会发生这种情况,同时瓷砖渲染线程仍在处理先前版本的瓷砖。缓存的不是新版本的瓷砖,而是先前的版本。由CATiledLayer支持的视图是UIScrollView的子视图,并且可以进行缩放。瓷砖的渲染可能很昂贵,并且可以使用渲染线程10ms。
示例:演示此问题的示例代码:https://github.com/Q42/CATiledLayerBug
示例:演示此问题的示例代码:https://github.com/Q42/CATiledLayerBug
- 在CATiledLayer中,开始渲染所有红色瓷砖(大约需要3秒钟才能完成)
- 每个渲染步骤大约需要10毫秒
- 在渲染过程中(经过800毫秒),使整个视图无效:
tiledView.setNeedsDisplay()
- 开始渲染所有灰色瓷砖(这再次需要大约3秒钟)
- 两个瓷砖(随机?)仍然保持红色,而不是变成灰色。
查看此处的 update
函数:https://github.com/Q42/CATiledLayerBug/blob/master/TiledLayerTest/ViewController.swift#L45
有解决方法吗?
这似乎是CATiledLayer
实现中的一个bug。由于我无法修复它,是否有人知道解决此问题的好方法?
我已经为此提交了一个radar:http://www.openradar.me/28648050