NSWindow Shadow Outline

9

Estou desenhando uma janela personalizada definindo uma exibição de conteúdo personalizada para a janela. Quando desenho a vista personalizada, dou-lhe cantos arredondados e um contorno agradável para imitar uma janela adequada.

No entanto, vejo outro contorno de 1 px ao redor da janela, que se desvia da borda nos cantos. Eu descobri que se eu desligo a sombra ela desaparece, mas obviamente, como isso quer agir como uma janela, eu preciso da sombra. Aqui está o que quero dizer sobre o esboço de 1px:

Como posso evitar isso?

EDITAR

Código para desenhar a vista de conteúdo da janela personalizada:

    NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:[self bounds] cornerRadius:5];

    NSGradient* aGradient = [[[NSGradient alloc] initWithColorsAndLocations:
                              [NSColor colorWithDeviceRed:0.5569 green:0.5137 blue:0.4588 alpha:1.0000], 0.0,
                              [NSColor colorWithDeviceRed:0.5569 green:0.5137 blue:0.4588 alpha:1.0000], 1.0,
                              nil] autorelease];

    [aGradient drawInBezierPath:path angle:90];

    [path setLineWidth:4];
    [[NSColor colorWithDeviceRed:0.4235 green:0.3922 blue:0.3451 alpha:0.9000] setStroke];
    [path strokeInside];

    [path setLineWidth:3];
    [[NSColor colorWithDeviceRed:0.8431 green:0.8314 blue:0.8078 alpha:1.0000] setStroke];
    [path strokeInside];

    [path setLineWidth:1];
    [[NSColor colorWithDeviceRed:0.4235 green:0.3922 blue:0.3451 alpha:0.9000] setStroke];
    [path strokeInside];
    
por Joshua 29.05.2011 в 14:23
fonte

5 respostas

3

Não me pergunte como consegui isso, mas isso resolverá seu problema.

Defina uma categoria para NSWindow com o seguinte conteúdo:

@implementation NSWindow(NoShadowRim)

- (id)_shadowRimInfo {
  return @{
    @"kCUIMeasureWindowFrameRimDensity": [NSNumber numberWithInt:0]
  };
}

@end

EXCLUSÃO DE RESPONSABILIDADE: Isto substitui o método interno de NSWindow , portanto, use-o por sua conta e risco. Pode quebrar com qualquer atualização do OS X.

    
por Mihhail 06.09.2015 / 20:45
fonte
1

Você precisa dizer à janela para recalcular sua sombra enviando -invalidateShadow .

    
por alastair 01.06.2011 / 18:00
fonte
1

Tente:

[[self window] display];
[[self window] setHasShadow:NO];
[[self window] setHasShadow:YES];
    
por Olof 08.03.2012 / 19:33
fonte
0

Esta linha que contorna a área da janela é desenhada automaticamente. Eu tenho uma janela que tem esta linha executando com precisão em torno de cantos arredondados inferiores. Você precisa configurar a janela como não opaca e a cor do plano de fundo como transparente:

  [self setOpaque:NO];
  [self setBackgroundColor:[NSColor clearColor]];

O lugar no contentView -drawRect: você faz

  [NSGraphicsContext saveGraphicsState];
  [pathWithBottomRoundedCorner addClip];
  // your drawing here...
  [NSGraphicsContext restoreGraphicsState];

Isso deve funcionar.

    
por febeling 13.07.2011 / 21:29
fonte
0

Como eu entendi corretamente, as sombras são desenhadas pelo servidor do Windows. Quando você desenha NSWindow personalizado com cantos arredondados ou outras formas não retangulares, o servidor de janelas não conta os pixels transparentes e não faz sombra sobre eles.

Eu desenvolvi alguns truques para evitar esse comportamento. Basta colocar mais sombra no seu caminho, algo assim:

NSShadow *headShadow = [[NSShadow alloc] init];
[headShadow setShadowColor:[NSColor colorWithSRGBRed:0.0 
                                               green:0.0 
                                                blue:0.0 
                                               alpha:0.16]];
[headShadow setShadowBlurRadius:0.0f];
[headShadow setShadowOffset:NSMakeSize(0.0f, 0.0f)];
[headShadow set];

Idealmente, para um resultado perfeito, a sombra do fink deve ser igual aos servidores de janela.

    
por Vadim 23.05.2012 / 10:31
fonte