iOS7脏的rect绘图怪异

时间:2013-11-12 12:44:59

标签: ios objective-c ios7 core-graphics

我一直在为iOS开发一个类似cad的绘图应用程序,它会仔细使用脏的直剪裁来获得平滑的绘图体验 - 它已经运行了好几个月。现在,我知道iOS不会自动剪辑脏域,但CoreGraphics会。作为参考,这是我的主视图的drawRect函数的前导码是什么样的(省略了实际的绘图机制)

- (void)drawRect:(CGRect)dirtyRect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);

    if ( !CGRectIsNull(dirtyRect))
    {
        CGContextClipToRect( context, dirtyRect );
    }

    CGContextConcatCTM( context, self.viewTransform );

    .... drawing here, all done by CG* vector and bitmap functionsa

    CGContextRestoreGState( context );
}

现在,这段代码在很长一段时间内都运行得很好,iOS6,iOS7早期构建等等。但就在最近,我一直看到一系列非常奇怪的行为,而且我很好奇这里是否有人有类似的经历。

首先,当我需要重绘整个视图时,我会触发重绘正常方式,setNeedsDisplay,并且setNeedsDisplayInRect传递一个脏矩形,只需要重绘一小部分。奇怪的是,最近当我调用setNeedsDisplayInRect时,我传递的矩形是忽略,而drawRect接收的矩形与视图的 bounds 匹配,而不是预期的子矩形。我只注意到这一点,当测试人员报告绘图性能与以前的版本相比显着下降时 - 我最近一直在使用模拟器并且没有注意到:/

我怀疑这可能是某种多脏矩形联合的结果,所以我重载了setNeedsDisplay和setNeedsDisplayInRect,在它们被调用时进行跟踪,但这无处可去。所以我决定在我的渲染视图类中手动跟踪我的脏矩形作为iVar。这是第二个奇怪现象出现的地方:当我剪切到现在正确的脏矩形时,脏矩形之外的内容被清除。

不应该清除它们。我已经明确地设置了self.clearsContextBeforeDrawing = NO,所以我不明白为什么我所看到的行为正在发生,特别是在过去没有发生的时候。

现在,我可能会做一个git-bisect调试风格,看看我是否能找到一个没有这个bug的版本。但我希望有人在这里获得CoreGraphics经验可以给我一些概念上的支持。这让我感到困惑。

P.S。我在很长一段时间内没有触及我的应用程序的绘图代码,因为我花了最近几个月开发应用程序围绕绘图工具。这就是为什么我怀疑对iOS7绘图管道的改变可能在这里发挥某种作用。

3 个答案:

答案 0 :(得分:0)

我认为您需要在drawRect方法的代码中包含此行: -

 [super drawRect:dirtyRect];

答案 1 :(得分:0)

对于今后在寻找iOS脏行帮助时遇到此问题的人,我想说我解决了这个问题,而且它是我的错误,而不是苹果的错误。我花了一个早上做一个git bisect来缩小故障时的范围,并发现当我在10月初进行一些重构时,我向我的模型引入了一些更改通知,间接导致setNeedsDisplay覆盖了setNeedsDisplayInRect我的触摸处理代码是费力的计算。

所以 - 不是苹果虫!

答案 2 :(得分:0)

drawRect:dirtyRect用于mac。对于ios,你应该使用drawRect:rect。应该使用setNeedsDisplay调用它。