2011-12-16 3 views
2

と奇妙な問題、この質問の答えに関連-setClip使用:Redrawedはめ込みNSShadow私が持っている方法

Draw an Inset NSShadow and 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で見つける:あなたの助けのための

Java setClip seems to redraw

感謝を!

答えて

5

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

+0

setClipと同じエフェクト(または同様のもの)で、再描画しません。私はそれを考慮に入れます。ありがとう! –

関連する問題