0

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

どんな洞察も大歓迎です:-)

4

1 に答える 1

0

NSShadowクラスリファレンスから:

シャドウは、デフォルトのユーザー座標空間に適用された変換に関係なく、常にその空間に描画されます。これは、現在の変換行列(CTM)の回転、平行移動、およびその他の変換が、結果のシャドウに影響を与えないことを意味します。

そして、それが最終的に反転することです。つまり、翻訳を拡大し、逆に縮小します。

NSGradientにはそのような声明はないので、それについてバグを提出することをお勧めします。

于 2011-03-19T23:28:22.560 に答える