0

我正在使用NSImage's-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具有翻转坐标系的 a 中时,阴影绘制得很好(尊重翻转)。上的文档-lockFocusFlipped似乎也很模糊。NSImage这就是类文档中所说的全部内容:

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

我还在Snow Leopard AppKit 发行说明中找到了这个说明

在某些情况下,例如直接通过 NSLayoutManager 进行绘制,需要翻转上下文。为了涵盖这种情况,我们添加

- (void)lockFocusFlipped:(BOOL)flipped;

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

在这种情况下,似乎没有任何文档解释NSShadow's 的行为。并且通过进一步的测试,似乎NSGradient并不尊重两者使用的绘图上下文的翻转状态NSImage

非常感谢任何见解:-)

4

1 回答 1

0

NSShadow 类参考

阴影总是在默认的用户坐标空间中绘制,而不管对该空间应用的任何变换。这意味着当前变换矩阵(CTM)的旋转、平移和其他变换不会影响生成的阴影。

这就是翻转的最终目的:向上翻译,以另一种方式缩小。

NSGradient 没有这样的声明,所以我建议提交一个关于那个的错误。

于 2011-03-19T23:28:22.560 回答