标签: setneedsdisplayinrect

在drawLayer:inContext期间调用setNeedsDisplayInRect:

我在我的应用程序中使用了CATiledLayer,因此,该图层的绘制是在后台线程中完成的.也就是说,我的委托的drawLayer:inContext:方法是从后台线程调用的.用于使CATiledLayer的部分无效的setNeedsDisplayInRect总是从主线程调用.

因为它们是独立的线程,所以有时候会调用setNeedsDisplayInRect而后台​​线程在drawLayer:inContext方法中.我注意到在那种情况下会忽略setNeedsDisplayInRect(不再调用drawLayer:inContext).

我已经向Apple记录了一个错误,因为我认为这是不正确的.但我很难弄清楚如何解决这种情况.你有好主意吗?

编辑:

我使用以下代码测试了Stanislaw的答案:

- (void) setNeedsDisplayInRect:(CGRect)rect
{
    NSLog(@"setNeedsDisplayInRect:%@", NSStringFromCGRect(rect));
    [super setNeedsDisplayInRect:rect];
}

- (void) drawLayer:(CALayer *)layer inContext:(CGContextRef)gc
{
    CGRect bounds = CGContextGetClipBoundingBox(gc);
    NSLog(@"drawLayer:inContext: bounds=%@", NSStringFromCGRect(bounds));

    dispatch_async(dispatch_get_current_queue(), ^{
        [self setNeedsDisplayInRect:bounds];
    });

    CGContextSetFillColorWithColor(gc, testColor.CGColor);
    CGContextFillRect(gc, bounds);
    sleep(0.2); // simulate the time it takes to draw complicated graphics
    NSLog(@"end drawLayer:inContext: bounds=%@", NSStringFromCGRect(bounds));
}
Run Code Online (Sandbox Code Playgroud)

如上所述,代码确实会导致绘图无限重复,但有时在setNeedsDisplayInRect:和相应的drawLayer:inContext:之间会有5秒的延迟,其中没有其他任何事情发生.请参阅下面的日志作为示例.注意不规则行为:在第一秒中,一些图块被重绘多次,其他图块只重绘一次.然后暂停5秒,循环再次开始.

这是在IOS6.0的模拟器上测试的(我选择那个版本,因为早期版本有另一个在6.0中修复的错误:它们有时会绘制两次相同的图块).

2012-10-27 15:51:38.771 TiledLayerTest[39934:15a13] drawLayer:inContext: bounds={{0, 300}, {300, 180}}
2012-10-27 15:51:38.774 TiledLayerTest[39934:15a13] end drawLayer:inContext: bounds={{0, 300}, {300, 180}}
2012-10-27 15:51:38.774 TiledLayerTest[39934:1570f] drawLayer:inContext: bounds={{300, …
Run Code Online (Sandbox Code Playgroud)

cocoa-touch drawing setneedsdisplayinrect ios

5
推荐指数
1
解决办法
2178
查看次数

标签 统计

cocoa-touch ×1

drawing ×1

ios ×1

setneedsdisplayinrect ×1