2014-03-29 2 views
0

У меня есть окно с пользовательским представлением в нем. Этот вид get - это изображение, нарисованное в качестве фона в нем. Предположим теперь, что это структурированное серое фоновое изображение.Проблемы с фоном: NSButton на NSView

- (void)drawRect:(NSRect)dirtyRect 
{ 
    [super drawRect:dirtyRect]; 
    [self.titlebarBGImage drawInRect:dirtyRect fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1]; 
} 

В этом пользовательском представлении я добавил квадратную текстурированную кнопку и настроил ее в IB, чтобы не иметь границы. В моей AppDelegate я затем дать этой кнопку изображение в методе applicationDidFinishLaunching:

// ... 
// [[self.minimizeButton cell] setBackgroundColor:[NSColor clearColor]]; 
[self.minimizeButton setImage:minimizeImage]; 
// ... 

Как-то же фон (titlebarBGImage) также обращается в качестве фона кнопки, так что он имеет структурированное серый цвет изображения, но по размеру размер кнопки. Это выглядит глупо, и я не хочу этого явно. Если я затем раскомментирую строку с setBackgroundColor:, фон очищается, но фон пользовательских представлений также не светит, когда изображение кнопок прозрачно (изображение кнопки - это круг), поэтому я получаю прямоугольник, в котором светит фон Windows (т. е зеленый цвет в изображении примера), а не на фоне зрения кнопки находится в

Вот изображение, чтобы понять, что происходит:

enter image description here

сверху вниз:

  • Что я хочу достичь, то есть вид серый структурированный Б.Г. просвечивает кнопки прозрачной области
  • Что я получаю с верхним кодом, т.е. без незакомментированной линии: Обычай рассматривает фон рисуется втиснулся в фоновом режиме кнопки
  • что я получаю с линией clearColor, то есть цвет окна (зеленый) светит, а не bg вида.

Как получить максимальный результат?

Редактировать: Я нажал example project to github, чтобы вы могли видеть, что я имею в виду.

+0

Я изменил название и надеюсь, что кто-то считает, что это перекати. Мне все равно нужен ответ, THX – beipawel

ответ

0

Один из способов решения этой проблемы - использование базовых слоев анимации. Я узнал this tutorial. Для этого вы попали в ваш файл MainMenu.xib, выберите объект Button и перейдите на вкладку слоев в утилите (см. Снимок экрана (1)). Затем активируйте Core Animation Layer для просмотра сверху. При этом все подэлементы также имеют Core Animation Layer (могут быть проблемы с производительностью, если проект больше, поэтому будьте осторожны).

How to activate Core Animation Layer

Далее я подклассы в NSButton (назвав его BPButtonView в моем проекте Github, который я обновляемой в настоящее время). Выберите кнопку в xib-файле и измените Пользовательский класс на номер BPButtonView или что бы вы его не назвали.

Don't forget to set the buttons correct class name in the Utilities sidebar

Код для нового NSButton подкласса выглядит следующим образом:

@implementation BPButtonView 

- (BOOL)wantsUpdateLayer { 
    return YES; 
} 

- (void)updateLayer { 
    if ([self.cell isHighlighted]) { 
     self.layer.contents = [NSImage imageNamed:@"buttonbg.png"]; 
    } else { 
     self.layer.contents = [NSImage imageNamed:@"buttonbg.png"]; 
    } 
} 

@end 

Я использовал Условный оператор в методе updateLayer просто чтобы показать, что в зависимости от состояния кнопок (нажата против .) вы можете предоставить другое изображение. В учебнике по видео есть также хороший трюк, как добиться чистого изменения размера изображения кнопок.

И вот скриншот полученного приложения. Красный круг посередине - кнопка, а зеленая текстурированная - это фон представлений.

Resulting App with NSView background and a button placed in this view

Смежные вопросы