Предстоящая OSX 10.10 ( "Yosemite" ) предлагает новый тип представления NSVisualEffectView, который поддерживает сквозную прозрачность или внутри окна. Меня в основном интересует прозрачность прозрачного окна, поэтому я собираюсь сосредоточиться на этом в этом вопросе, но это относится и к полупрозрачности внутри окна.
Использование прозрачной прозрачности в 10.10 тривиально. Вы просто разместите NSVisualEffectView
где-нибудь в своей иерархии представлений и установите ее blendingMode
на NSVisualEffectBlendingModeBehindWindow
. Это все, что нужно.
В разделе 10.10 вы можете определить NSVisualEffectView
в IB, установить свой режим режима смешивания, и вы выключены и запущены.
Однако, если вы хотите быть обратно совместимым с более ранними версиями OSX, вы не можете этого сделать. Если вы попытаетесь включить NSVisualEffectView
в свой XIB, вы потерпите крах, как только вы попытаетесь загрузить XIB.
Я хочу, чтобы оно "установило его и забудет", которое предложит прозрачность при запуске в 10.10 и просто ухудшится до непрозрачного представления при запуске в более ранних версиях ОС.
То, что я сделал до сих пор, заключается в том, чтобы сделать рассматриваемое представление обычным NSView в XIB, а затем добавить код (вызванный awakeFromNib), который проверяет на [NSVisualEffectView class] != nil
, и когда он определяется классом, я создаю экземпляр NSVisualEffectView, переместите все мои текущие представления в представлении на новое представление и установите его на место. Это работает, но это настраиваемый код, который я должен писать каждый раз, когда хочу полупрозрачный вид.
Я думаю, что это возможно, используя объект NSProxy. Вот что я думаю:
Определите пользовательский подкласс NSView (позвоните ему в MyTranslucentView). Во всех методах init (initWithFrame и initWithCoder) я удалял вновь созданный объект и вместо этого создавал подкласс NSProxy с частной переменной экземпляра (myActualView). Во время init он решил создать объект myActualView как NSVisualEffectView, если OS >= 10.10 и обычный NSView под OS < 10.10.
Прокси-сервер пересылал бы ВСЕ сообщения myActualView.
Это будет довольно суетливый, низкоуровневый код, но я думаю, что он должен работать.
Кто-нибудь сделал что-то подобное? Если да, можете ли вы указать мне в правильном направлении или дать мне какие-либо указатели?
Apple является MUCH более открытой с бета-соглашением с Yosemite a, чем с предыдущими бета-версиями. Я не думаю, что нарушаю свою бета-версию NDA, говоря об этом в общих чертах, но фактический код с использованием NSVisualEffectView
, вероятно, должен быть совместно использован в NDA...