【问题标题】:How to properly use setPatternOffset to fix NSColor colorWithPatternImage insanity如何正确使用 setPatternOffset 修复 NSColor colorWithPatternImage 精神错乱
【发布时间】:2014-08-01 00:02:56
【问题描述】:

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

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

  1. 调整窗口大小时,模式会以令人惊讶的方式向上或向下滚动。
  2. 当滚动视图滚动,然后向后滚动时,新绘制的图案不会与图案的滚动(缓冲)部分对齐。

我可以通过调用 CGContextConvertPointToDeviceSpace、传入 0,0 并查看我返回的内容来解决问题 2——这告诉我我的滚动偏移量,然后我可以将其与 CGContextSetPatternPhase 一起使用来解决问题。 (虽然它并没有完全解决它——当我快速滚动时,我仍然看到不匹配的模式,原因我还没有理清。)

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

没有在所有绘图代码中添加一堆管道以传递窗口引用,有没有办法找出正确的偏移量,以便在调整窗口大小时我的图案将保持不变,并在scrollview 滚动了吗?

【问题讨论】:

    标签: cocoa drawing coordinate-systems


    【解决方案1】:

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

    (或者至少,它在我的应用程序中是这样的;我很早就在管道中设置了 CTM,以便为我提供一个自上而下的坐标系,以便我可以在 iOS 上使用几乎相同的代码。)

    所以,如果我只是调用 CGContextGetCTM,然后将结果的 .x0 和 .y0 值传递给 CGContextSetPatternPhase,它基本上可以工作。

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

    【讨论】:

    • 这可能相关也可能不相关,但是如果您试图在滚动时将模式放置在相同的位置,那么您可能需要查看设置 NSClipView.copiesOnScroll = NO ( NSClipView 通常是 NSScrollView 的直接子视图)。 copiesOnScroll = YES 的默认值将导致滚动绘图代码在滚动发生时有效地移动模式,这可能不是您想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    相关资源
    最近更新 更多