gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:21:33 25 4
gpt4 key购买 nike

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

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

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

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

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

除了向所有绘图代码添加一堆管道以传递窗口引用之外,有没有什么方法可以找出正确的偏移量,以便我的图案在调整窗口大小时保持不变,并在调整窗口大小时正确滚动 ScrollView 是否滚动?

最佳答案

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

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

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

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

关于cocoa - 如何正确使用 setPatternOffset 来修复 NSColor colorWithPatternImage 疯狂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25063559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com