当使由CATiledLayer支持的视图无效时,以前的瓷砖仍然是“卡住”的,不能正确地失效。
这似乎发生在视图失效时(在主线程上),同时,平铺呈现线程仍在处理以前版本的瓦片。而不是缓存新版本的瓷砖,前一个版本是缓存。
由CATiledLayer支持的视图是UIScrollView的子视图,并且是可缩放的。砖块的渲染可能很昂贵,并且可以使用渲染线程10 of。
示例
演示此问题的示例代码: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
发布于 2016-10-17 17:41:59
基于我在示例项目中添加的一些进一步的日志记录,我认为问题是:
CATiledLayer有两个呈现线程,用于绘制每个平铺。如果在执行draw(_: CGRect)调用期间调用setNeedsDisplay,则完成draw调用的当前执行并缓存结果。缓存的值是基于以前的“数据源”(本例中只是瓷砖颜色),而不是更新的数据源。
一位苹果支持工程师为我提供了一个解决办法:
updateID字段添加到TiledViewdraw(_: CGRect)调用的开始保存当前的updateIDupdateIDdraw(_: CGRect)调用的末尾,将保存的updateID与当前的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)
}
}
}https://stackoverflow.com/questions/39891468
复制相似问题