Перерисованная вставка NSShadow в пользовательском представлении с использованием метода -setClip - PullRequest
2 голосов
/ 16 декабря 2011

У меня есть странная проблема, связанная с ответом на этот вопрос:

Нарисуйте 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 Ответ

6 голосов
/ 18 декабря 2011

Вы никогда не должны использовать -setClip, если не знаете, что делаете. Вместо этого следует использовать -addClip, который учитывает существующие пути отсечения.

...