当CATiledLayer支持的视图无效时,前一个图块仍然“卡住”并且未正确无效。
这似乎发生在视图无效时(在主线程上),同时,磁贴渲染线程仍然在以前版本的磁贴上工作。不是缓存新版本的磁贴,而是缓存先前版本。
CATiledLayer支持的视图是UIScrollView的子视图,可以缩放。平铺的渲染可能很昂贵,并且可以使用渲染线程10ms。
演示此问题的示例代码:https://github.com/Q42/CATiledLayerBug
tiledView.setNeedsDisplay()
请在此处查看update
功能:https://github.com/Q42/CATiledLayerBug/blob/master/TiledLayerTest/ViewController.swift#L45
这似乎是CATiledLayer
实施中的一个错误。由于我无法解决这个问题,有没有人知道这个问题的一个好的解决方法?
我为此提出了一个雷达:http://www.openradar.me/28648050
答案 0 :(得分:2)
基于我添加到示例项目中的一些进一步的日志记录,我认为问题是:
CATiledLayer
有两个绘制每个图块的渲染线程。如果在执行draw(_: CGRect)
调用期间调用了setNeedsDisplay
,则draw
调用的当前执行结束并且结果被缓存。缓存的值基于先前的“数据源”(本示例中仅为tile颜色),而不是更新的数据源。
Apple支持工程师为我提供了一种解决方法:
updateID
字段添加到TiledView draw(_: CGRect)
来电的开头,保存当前updateID
updateID
draw(_: CGRect)
来电的结尾,将保存的updateID
与当前的setNeedsDisplay
进行比较。override func draw(_ rect: CGRect) {
let originalID = updateID
// all actual (slow) drawing code here...
if originalID != updateID {
// dispatch a redraw request, but wait a little while first
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(17)) {
self.layer.setNeedsDisplayIn(rect)
}
}
}
来电。提取物:
archivo