Перерисованная вставка 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 вместо этого, который учитывает существующие пути отсечения.

Другие вопросы по тегам