Странное поведение при рисовании NSSegmentedControl при рисовании суперпредставления - PullRequest
0 голосов
/ 26 октября 2011

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

Вот фотографии, которые демонстрируют проблему:

С пользовательским представлением в фоновом режиме: enter image description here

Без пользовательского представления в фоновом режиме: enter image description here

Как вы можете видеть в левом верхнем углу первого изображения, сегментированный элемент управления не отрисовывается должным образом. Вот метод drawRect из пользовательского представления:

- (void)drawRect:(NSRect)dirtyRect {

    NSShadow *shadow = [[NSShadow alloc] init];

    [shadow setShadowOffset:NSMakeSize(0.0, -6.0)];

    [shadow setShadowBlurRadius:3.0];

    [shadow setShadowColor:[[NSColor blackColor] colorWithAlphaComponent:0.3]];

    [shadow set];



    NSGradient *gradient = [[NSGradient alloc] initWithColorsAndLocations:[NSColor colorWithDeviceWhite:0.8 alpha:1.0],(CGFloat)0.0,[NSColor colorWithDeviceWhite:0.65 alpha:1.0],(CGFloat)0.5,[NSColor colorWithDeviceWhite:0.3 alpha:1.0],(CGFloat)0.5,[NSColor colorWithDeviceWhite:0.5 alpha:1.0],(CGFloat)1.0, nil];

    [gradient drawInRect:self.bounds angle:90];



    NSBezierPath *bezierPath = [NSBezierPath bezierPath];

    [bezierPath moveToPoint:NSMakePoint(0, 0)];

    [bezierPath lineToPoint:NSMakePoint(-self.bounds.size.height, 0)];

    [bezierPath lineToPoint:NSMakePoint(-self.bounds.size.height, -self.bounds.size.width)];

    [bezierPath lineToPoint:NSMakePoint(0, -self.bounds.size.width)];



    [[NSColor whiteColor] set];



    [bezierPath stroke];

}    

Можете ли вы помочь мне с этим? Я не знаю, как решить эту проблему.

Ответы [ 2 ]

1 голос
/ 21 декабря 2012

На 10.7+ сегментированные элементы управления и кнопки с закругленными текстурами прозрачны. 10.5-10.6 они заполнены градиентом.

1 голос
/ 26 июня 2012

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

Посмотрите документацию для метода set NSShadow. NSShadow Documentation

"Атрибуты тени приемника используются до тех пор, пока не будет установлена ​​другая тень или пока не будет восстановлено графическое состояние *1009*."

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

NSGraphicsContext *context = [NSGraphicsContext currentContext];
[context saveGraphicsState];

NSShadow *myCoolShadow = [NSShadow new];
// Shadow code here
[myCoolShadow set];

[context restoreGraphicsState];
...