この質問の答えに関連して、私は奇妙な問題を抱えています:
Inset NSShadow と Inset Stroke を描画する
このコードをカスタム ビューの drawRect メソッドで使用します。私はまさにこれを持っています:
- (void)drawRect:(NSRect)rect
{
// Create and fill the shown path
NSBezierPath *path = [NSBezierPath
bezierPathWithRoundedRect:[self bounds]
xRadius:4.0f
yRadius:4.0f];
[[NSColor colorWithCalibratedWhite:0.8f alpha:0.2f] set];
[path fill];
// Save the graphics state for shadow
[NSGraphicsContext saveGraphicsState];
// Set the shown path as the clip
[path setClip];
// Create and stroke the shadow
NSShadow * shadow = [[[NSShadow alloc] init] autorelease];
[shadow setShadowColor:[NSColor colorWithCalibratedWhite:0.0f alpha:0.8f]];
[shadow setShadowBlurRadius:2.0];
[shadow set];
[path stroke];
// Restore the graphics state
[NSGraphicsContext restoreGraphicsState];
if ( highlight && [[self window] firstResponder] == self ) {
NSSetFocusRingStyle(NSFocusRingOnly);
[[NSBezierPath bezierPathWithRect:[self bounds]] fill];
}
}
マルチライン ラベル (カスタム ビューの兄弟または子) を追加すると問題が発生します。
プログラム ウィンドウがフォーカスを失って戻ってくると、内側の影/ストロークが暗くなります。影が重なっているように見えます。私のウィンドウにこのカスタムビューしかない場合、それはうまくいくので、それは奇妙です。
行にコメントすると
[path setClip];
影はもう重ねられませんが、丸みを帯びたコーナーの望ましい効果は得られません (NSBox と同様)。
マルチラインラベルの代わりにプッシュボタンで何が起こるか試してみました.ウィンドウのフォーカスを失ったり取得したりすることで問題はありませんが、ボタンをクリックすると影が重なってしまいます.
問題はここと似ていますが、Java ではなく Cocoa にあります。
ご協力いただきありがとうございます!