2011-12-16 5 views
2

У меня есть и нечетная проблема, связанный с ответом этого вопроса:Redrawed врезка NSShadow на заказ View с помощью метода -setClip

Draw an Inset NSShadow and 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]; 
    } 
} 

Проблема возникает, когда я добавить Multiline этикетки (либо брат, сестра или ребенок моего пользовательского представления).

Когда мое окно программы теряет фокус, и я возвращаюсь к нему, моя внутренняя тень/ход становятся темнее. Кажется, что тени накладываются. Это странно, потому что, как сказано, если мое окно имеет только этот пользовательский вид, все идет хорошо.

Если я комментирую строку

[path setClip]; 

тень не наложена больше, но я не получаю желаемого эффекта скругленных углов (аналогичный чем NSBox).

Я пробовал то, что происходит с кнопкой, а не с многострочной меткой, и, теряя/получая фокус окна, проблем нет, но когда я нажимаю кнопку, тень накладывается.

Я считаю, что проблема похожа, чем здесь, но в какао вместо Java:

Java setClip seems to redraw

Спасибо за вашу помощь!

ответ

5

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

+0

Тот же эффект (или аналогичный), что и setClip, и нет перерисовки. Я буду учитывать это. Благодаря! –