0

NSSegmentedControl に問題があります。影付きのグラデーションを描画するカスタム ビューがあります。描画は問題ありませんが、その内部に NSSegmentedControl を配置すると、奇妙なことが起こります。セグメント化されたコントロールのアルファ値が低いかのように、カスタム ビューの背景がセグメント化されたコントロールを通して輝いています。

問題を示す写真は次のとおりです。

バックグラウンドでのカスタム ビュー: ここに画像の説明を入力

バックグラウンドでのカスタムビューなし: ここに画像の説明を入力

最初の画像の左上隅にあるように、セグメント化されたコントロールが正しく描画されていません。カスタム ビューの 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];

}    

これで私を助けてもらえますか?この問題を解決する方法がわかりません。

4

2 に答える 2

1

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

NSShadow の set メソッドのドキュメントを参照してください。 NSShadow ドキュメント

「レシーバーのシャドウ属性は、別のシャドウが設定されるか、グラフィックス状態が復元されるまで使用されます。」

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

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

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

[context restoreGraphicsState];
于 2012-06-26T06:25:09.640 に答える
1

10.7 以降では、丸みを帯びたテクスチャのセグメント化されたコントロールとボタンが透明になります。10.5 ~ 10.6 では、グラデーションで塗りつぶされます。

于 2012-12-21T05:05:19.377 に答える