Перерисованная вставка NSShadow в пользовательском представлении с использованием метода -setClip
У меня есть и странная проблема, связанная с ответом на этот вопрос:
Нарисуйте вставку NSShadow и Inset Stroke
Я использую этот код в методе drawRect пользовательского представления. У меня есть именно это:
- (void)drawRect:(NSRect)rect
{
// Create and fill the shown path
NSBezierPath *path = [NSBezierPath
bezierPathWithRoundedRect:[self bounds]
xRadius:4.0f
yRadius:4.0f];
[[NSColor colorWithCalibratedWhite:0.8f alpha:0.2f] set];
[path fill];
// Save the graphics state for shadow
[NSGraphicsContext saveGraphicsState];
// Set the shown path as the clip
[path setClip];
// Create and stroke the shadow
NSShadow * shadow = [[[NSShadow alloc] init] autorelease];
[shadow setShadowColor:[NSColor colorWithCalibratedWhite:0.0f alpha:0.8f]];
[shadow setShadowBlurRadius:2.0];
[shadow set];
[path stroke];
// Restore the graphics state
[NSGraphicsContext restoreGraphicsState];
if ( highlight && [[self window] firstResponder] == self ) {
NSSetFocusRingStyle(NSFocusRingOnly);
[[NSBezierPath bezierPathWithRect:[self bounds]] fill];
}
}
Проблема возникает, когда я добавляю многострочную метку (брат или потомок моего пользовательского представления).
Когда окно моей программы теряет фокус, и я возвращаюсь к нему, моя внутренняя тень / мазок становятся темнее. Кажется, что тени накладываются. Это странно, потому что, как сказано, если у моего окна есть только этот пользовательский вид, все идет хорошо.
Если я прокомментирую строку
[path setClip];
тень больше не накладывается, но я не получаю желаемого эффекта закругленных углов (аналогично NSBox).
Я попробовал то, что происходит с кнопкой вместо многострочной метки, и с потерей / получением фокуса окна у него нет проблем, но когда я нажимаю кнопку, тень накладывается.
Я считаю, что проблема похожа, чем здесь, но в Какао вместо Java:
Java setClip, кажется, перерисовать
Спасибо за вашу помощь!
1 ответ
Вы никогда не должны использовать -setClip
если вы не знаете, что делаете. Вы должны использовать -addClip
вместо этого, который учитывает существующие пути отсечения.