0

内部にNSView角丸長方形のグリッドを描画するカスタム サブクラスがあります。これNSViewは Interface Builder で配置され、その上に s がいくつかありNSButtonます。

問題は、ビューが再描画されると (つまり、その上にあるボタンをクリックすると)、上にとどまるはずのいくつかのボタンの上に再描画されることがあることです。これが発生すると、ループの前に描画された背景の長方形ではなく、ボタンの上に小さな丸みを帯びた長方形のみが表示されます。

drawRect のコード形式は次のとおりです。

[NSGraphicsContext saveGraphicsState];

NSBezierPath *path = [NSBezierPath bezierPathWithRect:self.bounds];
[[NSColor grayColor] set];
[path fill];

[NSGraphicsContext restoreGraphicsState];

for( int r = 0; r < 15; r++ ){
    for( int c = 0; c < 15; c++ ) {

        [NSGraphicsContext saveGraphicsState];

        // Draw shape
        NSRect rect = NSMakeRect(20 * c, 20 * r, 15, 15);
        NSBezierPath *roundedRect = [NSBezierPath bezierPathWithRoundedRect: rect xRadius:1 yRadius:1];

        [roundedRect setClip];

        // Fill
        [[NSColor colorWithCalibratedHue:0 saturation:0 brightness:0.3 alpha:1] set];
        [roundedRect fill];


        // Stroke
        [[NSColor colorWithCalibratedHue:0 saturation:0 brightness:0.5 alpha:1] set];
        [roundedRect setLineWidth:2.0];
        [roundedRect stroke];

        [NSGraphicsContext restoreGraphicsState];

    }
}

スクリーンショットは次のとおりです。 スクリーンショット

更新:コードを簡素化し、スクリーンショットを追加しました。

4

2 に答える 2

0

OK を削除してsetClip、内側のストロークを描画する別の方法を見つけることで、これを解決できました。

使用中にこれを解決できると確信してsetClipいますが、今回はこの解決策でうまくいきました。

于 2013-09-29T21:03:50.410 に答える