NSImage -lockFocusFlipped的奇怪问题:

时间:2011-03-18 21:04:55

标签: objective-c cocoa nsimage appkit nsshadow

我正在使用NSImage的{​​{1}}方法对图片进行绘制。我的代码如下所示:

-lockFocusFlipped:

此代码适用于某一点。我可以确认上下文确实被翻转了,因为NSImage *image = [[NSImage alloc] initWithSize:NSMakeSize(256, 256)]; [image lockFocusFlipped:YES]; NSShadow *shadow = [[NSShadow alloc] init]; [shadow setShadowColor:[NSColor blackColor]]; [shadow setShadowBlurRadius:6.0]; [shadow setShadowOffset:NSMakeSize(0, 3)]; [shadow set]; NSRect shapeRect = NSMakeRect(0, 0, 256, 100); [[NSColor redColor] set]; NSRectFill(shapeRect); [image unlockFocus]; 返回[[NSGraphicsContext currentContext] isFlipped],并且因为YES被绘制在正确的位置(使用左上角作为原点)。也就是说,shapeRect似乎并不尊重上下文的翻转状态。将阴影偏移设置为NSShadow时,应该在翻转上下文时将阴影向下移动,但实际上将其移动向上(这是标准中会发生的情况)非翻转的上下文)。

这个问题似乎特定于(0, 3),因为当我使用相同的代码绘制到具有翻转坐标系的-lockFocusFlipped时,阴影被绘制得很好(尊重翻转)。 CALayer上的文档似乎也很模糊。这就是-lockFocusFlipped类文档中所说的全部内容:

  

使用指定的翻转状态准备图像以接收绘图命令。

我还在Snow Leopard AppKit Release Notes

中找到了这个说明
  

有些情况,例如直接通过NSLayoutManager绘图,需要翻转的上下文。为了涵盖这种情况,我们添加

     

NSImage

     

这不会改变图像本身的状态,只会改变锁定焦点的上下文。这意味着(0,0)位于左上方,沿着Y轴的正向位于锁定的上下文中。

在这种情况下,没有一个文档能够解释- (void)lockFocusFlipped:(BOOL)flipped;的行为。通过进一步测试,似乎NSShadow似乎不尊重NSGradient使用的绘图上下文的翻转状态。

非常感谢任何见解: - )

1 个答案:

答案 0 :(得分:0)

来自NSShadow class reference

  

无论应用于该空间的任何变换如何,都始终在默认用户坐标空间中绘制阴影。这意味着当前变换矩阵(CTM)的旋转,平移和其他变换不会影响生成的阴影。

最终翻转的是:Translate up, scale back the other way.

NSGradient没有这样的陈述,所以我建议filing a bug关于那个。