【发布时间】:2013-11-12 12:44:58
【问题描述】:
我一直在为 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 时,我传递的 rect 被 忽略,而 drawRect 接收到一个与视图的 bounds 匹配的 rect,而不是预期的 subrect。我只是在测试人员报告与以前的版本相比绘图性能非常差时才注意到这一点 - 我最近使用模拟器太多并且没有注意到:/
我怀疑这可能是某种多脏矩形联合的结果,所以我重载了 setNeedsDisplay 和 setNeedsDisplayInRect,跟踪它们何时被调用,但这无济于事。所以我决定在我的渲染视图类中手动跟踪我的脏矩形作为 iVar。这是第二个奇怪的地方:当我剪辑到现在正确脏矩形时,脏矩形之外的内容被清除。
它们不应该被清除。我已明确设置 self.clearsContextBeforeDrawing = NO,所以我不明白为什么我看到的行为会发生,尤其是在过去没有发生的情况下。
现在,我可能会做一个 git-bisect 风格的调试,看看我是否能找到一个没有这个错误的版本。但我希望这里有 CoreGraphics 经验的人能给我一些概念上的支持。这让我完全困惑。
附:自从我在过去几个月中围绕绘图工具开发应用程序以来,我已经很长时间没有接触过我的应用程序的绘图代码了。这就是为什么我怀疑对 iOS7 的绘图管道的更改可能会在这里发挥某种作用。
【问题讨论】:
-
原来是我的错误 - 这很好,因为现在它已修复!而且我不需要等待 Apple 修复一些很难为其构建可重现的演示的东西。
标签: ios objective-c ios7 core-graphics