我正在使用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
使用的绘图上下文的翻转状态。
非常感谢任何见解: - )
答案 0 :(得分:0)
无论应用于该空间的任何变换如何,都始终在默认用户坐标空间中绘制阴影。这意味着当前变换矩阵(CTM)的旋转,平移和其他变换不会影响生成的阴影。
最终翻转的是:Translate up, scale back the other way.
NSGradient没有这样的陈述,所以我建议filing a bug关于那个。