2

この質問の答えに関連して、私は奇妙な問題を抱えています:

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 にあります。

Java setClip が再描画されるようです

ご協力いただきありがとうございます!

4

1 に答える 1

6

-setClip自分が何をしているのかわからない限り、絶対に使用しないでください。-addClip代わりに、既存のクリッピング パスを尊重するを使用する必要があります。

于 2011-12-18T02:43:06.610 に答える