内部に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];
}
}
スクリーンショットは次のとおりです。
更新:コードを簡素化し、スクリーンショットを追加しました。