NSImage
のメソッドを使用-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
も非常に曖昧なようです。これは、NSImage
クラスのドキュメントに記載されているすべてです。
指定された反転状態を使用して描画コマンドを受け取るようにイメージを準備します。
また、Snow Leopard AppKit リリース ノートにも次のメモがありました。
たとえば、NSLayoutManager を介して直接描画する場合など、反転したコンテキストが必要になる場合があります。このケースをカバーするために、追加します
- (void)lockFocusFlipped:(BOOL)flipped;
これは画像自体の状態を変更せず、フォーカスがロックされているコンテキストのみを変更します。ロックされたコンテキストでは、(0,0) が左上にあり、Y 軸に沿った正が下にあることを意味します。
NSShadow
この場合、どのドキュメントも の動作を説明していないようです。さらにテストを重ねた結果、いずれかNSGradient
で使用される描画コンテキストの反転状態を尊重していないようですNSImage
。
どんな洞察も大歓迎です:-)