2015-03-26 3 views
2

Я хочу нарисовать изображение с композитной работой HardLight. Я создал NSImageView со следующим кодом рисования:Смешивание над NSVisualEffectView

- (void)drawRect:(NSRect)dirtyRect { 
//[super drawRect:dirtyRect]; 

if (self.image != NULL) { 
    [self.image drawInRect:self.bounds fromRect:NSZeroRect operation:NSCompositeHardLight fraction:1.0]; 
} 

}

В обычном случае это работает хорошо. Но это не работает над NSVisualEffectView.

Как сменить HardLight на NSVisualEffectView?

на картинке, приведенной ниже, вы можете увидеть закругленный прямоугольник, который смешивает HardLight над фоном окна и цветным изображением. Но над NSVisualEffectView (красный нижний прямоугольник) он рисует только серый цвет.

https://www.dropbox.com/s/bcpe6vdha6xfc5t/Screenshot%202015-03-27%2000.32.53.png?dl=0

+0

Удалось решить эту проблему? У меня такая же проблема здесь: http://stackoverflow.com/questions/33341763/transparent-window-with-visual-effects-that-affect-the-content-in-underlying и хотите знать, возможно ли .. – Grigory

ответ

2

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

Я предполагаю, что вы говорите о смешении окон (NSVisualEffectBlendingModeBehindWindow) здесь. Проблема с NSVisualEffectView заключается в том, что она ничего не рисует. Вместо этого он определяет регион, который сообщает процессу WindowServer делать свою активность в этом регионе. Это происходит после того, как ваше приложение рисует свои представления.

Поэтому операция компоновки в вашем приложении не может принимать во внимание пиксели, которые оконный сервер рисует позже. Короче говоря, это невозможно.

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