NSWindow Shadow Outline - PullRequest
       16

NSWindow Shadow Outline

9 голосов
/ 29 мая 2011

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

Тем не менее, я вижу еще один контур размером 1 пиксель вокруг окна, который отклоняется от края в углах. Я обнаружил, что если я выключаю тень, она уходит, но, очевидно, поскольку она хочет действовать как окно, мне нужна тень. Вот что я имею в виду в плане 1px:

enter image description here

Как я могу предотвратить это?


EDIT

Код для рисования представления содержимого пользовательского окна:

    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];

Ответы [ 5 ]

3 голосов
/ 06 сентября 2015

Не спрашивайте меня, как я это получил, но это решит вашу проблему.

Определите категорию для NSWindow со следующим содержанием:

@implementation NSWindow(NoShadowRim)

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

@end

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Это переопределяет внутренний метод NSWindow, поэтому используйте его на свой страх и риск.Это может сломаться с любым обновлением OS X.

1 голос
/ 08 марта 2012

Попробуйте:

[[self window] display];
[[self window] setHasShadow:NO];
[[self window] setHasShadow:YES];
1 голос
/ 01 июня 2011

Вы должны указать окну пересчитать его тень, отправив -invalidateShadow.

0 голосов
/ 23 мая 2012

Как я правильно понимаю, тени рисуются сервером Windows. Когда вы рисуете пользовательское NSWindow с закругленными углами или другими непрямоугольными формами, сервер окна не считает эти прозрачные пиксели и не отбрасывает тени под ними.

Я разработал некоторый хак, чтобы избежать такого поведения. Просто добавьте дополнительную тень под свой путь, что-то вроде этого:

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];

В идеале для идеального результата тень fink должна быть равна оконным серверам.

0 голосов
/ 13 июля 2011

Эта линия, очерчивающая область окна, рисуется автоматически.У меня есть окно, в котором эта линия проходит точно по нижним закругленным углам.Вы должны настроить окно как непрозрачное, а цвет фона - прозрачный:

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

Где-то в contentView -drawRect: вы делаете

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

Это должно работать.1007 *

...