Странное поведение отрисовки NSSegmentedControl при отрисовке суперпредставления

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

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

С пользовательским видом в фоновом режиме: введите здесь описание изображения

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

Как вы можете видеть в левом верхнем углу на первом изображении, сегментированный элемент управления отображается неправильно. Вот метод 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];

}    

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


person Kai Engelhardt    schedule 26.10.2011    source источник
comment
Все | Гро... | Любимый... контроль? Я не могу понять, в чем проблема.   -  person paulmelnikow    schedule 29.10.2011
comment
Мне жаль. Я был немного неточен. Я имею в виду сегментированный элемент управления «вперед-назад» — у него не должно быть этого уродливого градиента на первом изображении.   -  person Kai Engelhardt    schedule 04.11.2011
comment
Итак, вы спрашиваете — почему градиент, который вы применяете к панели инструментов, переходит в кнопки «назад-вперед» и «+»?   -  person paulmelnikow    schedule 04.11.2011


Ответы (2)


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

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

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

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

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

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

[context restoreGraphicsState];
person Ryan Nichols    schedule 26.06.2012

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

person Aditya Vaidyam    schedule 21.12.2012