Как я могу использовать NSVisualEffectView в строке заголовка окна?
В OS X Yosemite Apple представила новый класс NSVisualEffectView
. В настоящее время этот класс недокументирован, но мы можем использовать его в Interface Builder.
Как я могу использовать NSVisualEffectView
в строке заголовка окна?
Вот пример: в Safari при прокрутке содержимое отображается под панелью инструментов и заголовком с эффектом вибрации и размытия.
![enter image description here]()
Ответы
Ответ 1
@sgonzalez ответ заставил меня исследовать файл NSWindow.h
, где я нашел свойство titlebarAppearsTransparent
.
Итак, получаем:
class BluredWindow: NSWindow {
override func awakeFromNib() {
let visualEffectView = NSVisualEffectView(frame: NSMakeRect(0, 0, 300, 180))
visualEffectView.material = NSVisualEffectMaterial.Dark
visualEffectView.blendingMode = NSVisualEffectBlendingMode.BehindWindow
visualEffectView.state = NSVisualEffectState.Active
self.styleMask = self.styleMask | NSFullSizeContentViewWindowMask
self.titlebarAppearsTransparent = true
//self.appearance = NSAppearance(named: NSAppearanceNameVibrantDark)
self.contentView.addSubview(visualEffectView)
self.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[visualEffectView]-0-|", options: NSLayoutFormatOptions.DirectionLeadingToTrailing, metrics: nil, views: ["visualEffectView":visualEffectView]))
self.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[visualEffectView]-0-|", options: NSLayoutFormatOptions.DirectionLeadingToTrailing, metrics: nil, views: ["visualEffectView":visualEffectView]))
}
Также вы можете настроить NSVisualEffectView в IB, он будет расширен на заголовке.
Ответ 2
Вам нужно изменить макет стиля окна, чтобы включить NSFullSizeContentViewWindowMask
, чтобы его содержимое могло "переполняться" в него.
Вы можете легко выполнить это, добавив эту строку в AppDelegate:
self.window.styleMask = self.window.styleMask | NSFullSizeContentViewWindowMask;
Если вы хотите, чтобы он был темным, как в FaceTime, вам также необходимо добавить эту строку кода:
self.window.appearance = NSAppearance(named: NSAppearanceNameVibrantDark)
Ответ 3
Пошаговое руководство с примерами:
http://stylekit.org/blog/2016/01/23/Chromeless-window/
Настройка прозрачности:
- Установите для параметра styleMask подкласса NSWindow значение
NSFullSizeContentViewWindowMask
(чтобы полупрозрачность также была видна в области заголовка, оставьте это, а область заголовка будет пустым)
- Установите
self.titlebarAppearsTransparent = true
(скрывает графику заголовка по умолчанию)
- Добавьте ниже код в подкласс NSWindow: (теперь вы должны иметь полупрозрачное окно)
.
let visualEffectView = NSVisualEffectView(frame: NSMakeRect(0, 0, 0, 0))//<---the width and height is set to 0, as this doesn't matter.
visualEffectView.material = NSVisualEffectMaterial.AppearanceBased//Dark,MediumLight,PopOver,UltraDark,AppearanceBased,Titlebar,Menu
visualEffectView.blendingMode = NSVisualEffectBlendingMode.BehindWindow//I think if you set this to WithinWindow you get the effect safari has in its TitleBar. It should have an Opaque background behind it or else it will not work well
visualEffectView.state = NSVisualEffectState.Active//FollowsWindowActiveState,Inactive
self.contentView = visualEffectView/*you can also add the visualEffectView to the contentview, just add some width and height to the visualEffectView, you also need to flip the view if you like to work from TopLeft, do this through subclassing*/
![введите описание изображения здесь]()
Также позволяет создавать прозрачные без хрома окна:
![введите описание изображения здесь]()