A showcase of many of the different styles of windows possible with NSWindow on MacOS. In some examples, NSToolbar, and NSVisualEffectView are used. No private API's are used.
To test each style, clone the project, open it in Xcode, uncomment each block of code in WindowController.swift and run. The numbers above each block correspond to each style below.
All code is in WindowController.swift in the windowDidLoad function. You should just be able to place each block inside that function to get the exact same result.
If you have a style to add, please make a pull request.
Don't show the title text in the titlebar.
window?.titleVisibility = .hiddenHide the titlebar completely.
window?.styleMask.remove(.titled)Create a vibrant background where whatever is behind the window can be slightly seen. This uses NSVisualEffectView.
let visualEffect = NSVisualEffectView()
visualEffect.blendingMode = .behindWindow
visualEffect.state = .active
visualEffect.material = .dark
window?.contentView = visualEffectvisualEffect.material can take multiple values including:
.appearanceBased: based on the views appearance.dark: dark appearance.ultraDark: ultra dark appearance.light: light appearance.mediumLight: medium light appearance- others such as
.menu,.popover,.selection,.sidebarand.titlebar
Same as above, with a transparent titlebar.
let visualEffect = NSVisualEffectView()
visualEffect.blendingMode = .behindWindow
visualEffect.state = .active
visualEffect.material = .dark
window?.contentView = visualEffect
window?.titlebarAppearsTransparent = true
window?.styleMask.insert(.fullSizeContentView)Same as above, without the titlebar.
let visualEffect = NSVisualEffectView()
visualEffect.blendingMode = .behindWindow
visualEffect.state = .active
visualEffect.material = .dark
window?.contentView = visualEffect
window?.styleMask.remove(.titled)
window?.isMovableByWindowBackground = trueA vibrant window with a custom border radius. The border radius value can be changed at visualEffect.layer?.cornerRadius = 16.0.
let visualEffect = NSVisualEffectView()
visualEffect.translatesAutoresizingMaskIntoConstraints = false
visualEffect.material = .dark
visualEffect.state = .active
visualEffect.wantsLayer = true
visualEffect.layer?.cornerRadius = 16.0
window?.titleVisibility = .hidden
window?.styleMask.remove(.titled)
window?.backgroundColor = .clear
window?.isMovableByWindowBackground = true
window?.contentView?.addSubview(visualEffect)
guard let constraints = window?.contentView else {
return
}
visualEffect.leadingAnchor.constraint(equalTo: constraints.leadingAnchor).isActive = true
visualEffect.trailingAnchor.constraint(equalTo: constraints.trailingAnchor).isActive = true
visualEffect.topAnchor.constraint(equalTo: constraints.topAnchor).isActive = true
visualEffect.bottomAnchor.constraint(equalTo: constraints.bottomAnchor).isActive = trueA vibrant window with a standard border radius and no window controls or title.
let visualEffect = NSVisualEffectView()
visualEffect.blendingMode = .behindWindow
visualEffect.state = .active
visualEffect.material = .dark
window?.contentView = visualEffect
window?.styleMask.insert(.titled)
window?.titlebarAppearsTransparent = true
window?.titleVisibility = .hidden
window?.standardWindowButton(.miniaturizeButton)?.isHidden = true
window?.standardWindowButton(.closeButton)?.isHidden = true
window?.standardWindowButton(.zoomButton)?.isHidden = true
window?.isMovableByWindowBackground = trueA window with a transparent titlebar.
window?.titlebarAppearsTransparent = trueSame as above with a background color.
window?.titlebarAppearsTransparent = true
window?.backgroundColor = .redA window with a toolbar.
let customToolbar = NSToolbar()
window?.titleVisibility = .hidden
window?.toolbar = customToolbarSame as above, with the toolbar transparent.
let customToolbar = NSToolbar()
window?.titlebarAppearsTransparent = true
window?.titleVisibility = .hidden
window?.toolbar = customToolbarSame as above, without the toolbar seperator.
let customToolbar = NSToolbar()
customToolbar.showsBaselineSeparator = false
window?.titlebarAppearsTransparent = true
window?.titleVisibility = .hidden
window?.toolbar = customToolbarSame as above, with a background color.
let customToolbar = NSToolbar()
customToolbar.showsBaselineSeparator = false
window?.titlebarAppearsTransparent = true
window?.titleVisibility = .hidden
window?.backgroundColor = .red
window?.toolbar = customToolbarA translucent toolbar allowing for content behind the toolbar to be slightly seen.
let customToolbar = NSToolbar()
window?.titleVisibility = .hidden
window?.styleMask.insert(.fullSizeContentView)
window?.contentView?.wantsLayer = true
window?.contentView?.layer?.contents = NSImage(named: NSImage.Name("Background"))
window?.toolbar = customToolbarSame as above with a titlebar instead of a toolbar.
window?.titleVisibility = .hidden
window?.styleMask.insert(.fullSizeContentView)
window?.contentView?.wantsLayer = true
window?.contentView?.layer?.contents = NSImage(named: NSImage.Name("Background"))Same as above with a transparent titlebar.
window?.titleVisibility = .hidden
window?.styleMask.insert(.fullSizeContentView)
window?.titlebarAppearsTransparent = true
window?.contentView?.wantsLayer = true
window?.contentView?.layer?.contents = NSImage(named: NSImage.Name("Background"))The macOS Mojave dark mode appearance.
if #available(OSX 10.14, *) {
window?.appearance = NSAppearance(named: .darkAqua)
}