2011-10-26 11 views
0

NSSegmentedControlに問題があります。 私はグラデーションを影で描くカスタムビューを持っています。 図面は大丈夫ですが、NSSegmentedControlをその中に配置すると、セグメント化されたコントロールのアルファ値が低いように、カスタムビューの背景がセグメント化されたコントロールを照らしています。バックグラウンドでのカスタムビューでスーパービューが描画されるときのNSSegmentedControlの奇妙な描画動作

enter image description here

背景にカスタムビューがない場合:ここで

は、問題を示し絵は、ある enter image description here

あなたが左に見ることができるように最初の画像の上隅では、セグメント化されたコントロールが適切に描画されません。ここ は、カスタムビューからのdrawRectメソッドです:

- (void)drawRect:(NSRect)dirtyRect { 

    NSShadow *shadow = [[NSShadow alloc] init]; 

    [shadow setShadowOffset:NSMakeSize(0.0, -6.0)]; 

    [shadow setShadowBlurRadius:3.0]; 

    [shadow setShadowColor:[[NSColor blackColor] colorWithAlphaComponent:0.3]]; 

    [shadow set]; 



    NSGradient *gradient = [[NSGradient alloc] initWithColorsAndLocations:[NSColor colorWithDeviceWhite:0.8 alpha:1.0],(CGFloat)0.0,[NSColor colorWithDeviceWhite:0.65 alpha:1.0],(CGFloat)0.5,[NSColor colorWithDeviceWhite:0.3 alpha:1.0],(CGFloat)0.5,[NSColor colorWithDeviceWhite:0.5 alpha:1.0],(CGFloat)1.0, nil]; 

    [gradient drawInRect:self.bounds angle:90]; 



    NSBezierPath *bezierPath = [NSBezierPath bezierPath]; 

    [bezierPath moveToPoint:NSMakePoint(0, 0)]; 

    [bezierPath lineToPoint:NSMakePoint(-self.bounds.size.height, 0)]; 

    [bezierPath lineToPoint:NSMakePoint(-self.bounds.size.height, -self.bounds.size.width)]; 

    [bezierPath lineToPoint:NSMakePoint(0, -self.bounds.size.width)]; 



    [[NSColor whiteColor] set]; 



    [bezierPath stroke]; 

}  

あなたはこれで私を助けることができますか? この問題を解決する方法がわかりません。

+0

すべて| Gro ... | Fav ...コントロール?私は問題が何であるか理解できません。 – paulmelnikow

+0

すみません。私は少し不正解でした。前向きにセグメント化されたコントロール - 最初の画像にこの醜い勾配を持つべきではありません。 –

+0

だから、あなたは、ツールバーに適用しているグラデーションがバックフォワードと+ボタンに滲み出るのはなぜですか? – paulmelnikow

答えて

1

ツールバーのボタンでカスタム描画を行っているかどうかはわかりませんが、グラフィックスコンテキストを保存したり復元したりせずにシャドウ上で「設定」を呼び出すことが問題だと思います。

NSShadowのsetメソッドのドキュメントを見てください。 NSShadow Documentation

「別の影が セットまたはグラフィック状態がを回復するまでになるまで受信機の影の属性が使用されています。」

常にグラフィックスコンテキストを保存してから、Cocoaのセットスタイルのメソッドを呼び出してコンテキストを復元する必要があります。これにより、将来の描画コマンドであなたの影が適用されなくなります。

NSGraphicsContext *context = [NSGraphicsContext currentContext]; 
[context saveGraphicsState]; 

NSShadow *myCoolShadow = [NSShadow new]; 
// Shadow code here 
[myCoolShadow set]; 

[context restoreGraphicsState]; 
1

10.7以上では、丸みを付けたセグメント化されたコントロールとボタンは透明です。 10.5-10.6では、グラデーションが塗りつぶされています。

関連する問題