我正在使用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
。
非常感谢任何见解:-)