在CATiledLayer上有效地绘制CGPath

JWo*_*ood 8 iphone cocoa-touch core-graphics objective-c

我怎样才能有效地画CGPath上一个CATiledLayer?我正在检查磁贴的边界框是否与路径的边界框相交,如下所示:

-(void)drawLayer:(CALayer*)layer inContext:(CGContextRef)context {
    CGRect boundingBox = CGPathGetPathBoundingBox(drawPath);
    CGRect rect = CGContextGetClipBoundingBox(context);

    if( !CGRectIntersectsRect(boundingBox, rect) )
        return;

    // Draw path...
}
Run Code Online (Sandbox Code Playgroud)

这不是很有效,因为drawLayer:inContext:从多个线程多次调用并导致多次绘制路径.

有没有更好,更有效的方法来做到这一点?

Rob*_*ier 5

最简单的选择是将曲线绘制成一个大图像,然后平铺图像.但是,如果你是平铺,这可能意味着图像太大了,或者你刚刚开始绘制路径,对吧?

所以你可能需要分开你的路径.最简单的方法是使用元素逐个拆分CGPathApply.对于每个元素,您可以检查其边界框并确定该元素是否属于您的边界.如果没有,只需跟踪最后一个终点即可.如果是,则移动到您看到的最后一个结束点,并将该元素添加到此图块的新路径中.完成后,每个磁贴将绘制自己的路径.

从技术上讲,你会"画出"超出界限的东西(例如延伸到瓷砖之外的线条),但这比听起来要便宜得多.Core Graphics将非常容易地剪辑单个元素.目标是避免计算完全不在边界框中的元素.

请务必缓存生成的路径.您不需要计算每个图块的路径; 只是你画的那些.但是每次瓦片绘制时都要避免重新计算.只要数据发生更改,就转储缓存.如果有非常多的瓷砖,您还可以使用它NSCache来更好地优化它.