如何正确使用setPatternOffset来修复NSColor colorWithPatternImage疯狂

时间:2014-07-31 15:53:33

标签: cocoa drawing coordinate-systems

我试图在NSScrollView中绘制一个平铺图案,它本身位于可调整大小的窗口内(在Mac OS X上)。代码只调用[NSColor colorWithPatternImage],CGContextSetFillColorWithColor和CGContextFillRect。

问题是图案是相对于窗口的左下角绘制的。这是记录在案的行为,但会导致两种不愉快的影响:

  1. 调整窗口大小时,图案会以非常令人惊讶的方式向上或向下滚动。
  2. 滚动滚动视图然后向后滚动时,新绘制的图案不会与图案的滚动(缓冲)部分对齐。
  3. 我能够通过调用CGContextConvertPointToDeviceSpace来解决问题2,传入0,0,看看我得到了什么 - 这告诉我我的滚动偏移,然后我可以使用CGContextSetPatternPhase来解决问题。 (虽然它没有完全解决它 - 当我快速滚动时,我仍然看到不匹配的模式,原因还没有解决。)

    但解决问题1确实非常棘手。从我的绘图代码,它只知道CGContext,我找不到任何方法来获得窗口高度。 (设备/用户空间转换例程似乎完全不受窗口高度的影响。)

    没有为所有绘图代码添加一堆管道以传递窗口引用,是否有任何方法可以找出正确的偏移量,以便在调整窗口大小时我的模式将保持不变,并在滚动浏览滚动?

1 个答案:

答案 0 :(得分:0)

糟糕 - 发布此消息后不久,我发现至少部分答案:当前转换矩阵(来自CGContextGetCTM)反映了窗口高度和滚动偏移。

(至少,它确实在我的应用程序中;我在管道中很早就设置了CTM以给我一个自上而下的坐标系统,所以我可以在iOS上使用相同的代码。)

因此,如果我只调用CGContextGetCTM,然后将结果的.x0和.y0值传递给CGContextSetPatternPhase,那么它几乎可以工作。

当我水平快速滚动时,我仍然遇到一些视觉故障,虽然不是垂直滚动 - 这是一种非常奇怪的效果,这表明它可能是我的代码中的某些内容,或者可能与内容区域是。我会进一步挖掘。