Пользовательский NSView рисует поверх элементов управления
У меня есть NSView
с пользовательским подклассом, который рисует сетку из прямоугольников со скругленными углами внутри него. это NSView
был размещен с помощью построителя интерфейса и поверх него у меня есть некоторые NSButton
s.
Проблема в том, что иногда, когда вид перерисовывается (то есть, когда я нажимаю на кнопку сверху), он перерисовывает поверх некоторых кнопок, которые должны оставаться сверху. Когда это происходит, над кнопками появляются только меньшие округлые участки, а не фоновый, который рисуется перед циклом.
Вот кодовая форма 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];
}
}
Вот скриншот:
Обновление: упрощен код, добавлен скриншот.
2 ответа
У Mac есть проблемы с перекрывающимися одноуровневыми представлениями. это не работало раньше.... 10.6, и это все еще не работает довольно часто.
использовать правильную иерархию супервизии / подпредставления
Хорошо, я только что решил эту проблему, удалив setClip
и найти другой способ нарисовать внутренний штрих.
Я уверен, что это можно решить, еще используя setClip
но это решение работало хорошо для меня на этот раз.