WWDC 20
Adopt the new look of macOS
macOS has an all new design
A new toolbar with inline title, big bold controls and integration with the window’s split view
Full height sidebars with colorful icons and updated symbol iconography
New appearance for lists/tables using a new inset selection style
Most of these changes happen automatically to your app (if you’re using classes like NSToolbar
and NSSplitViewController
)
Sidebars
Sidebar: use NSSplitViewController
, items configured using NSSplitViewItem.Behavior.sidebar
Use full size content window mask – NSWindow.StyleMask.fullSizeContentView
, so that content is laid out in the space normally taken by the title bar
NSView
properties to find the safe areas of the view: safeAreaInsets
, safeAreaLayoutGuide
, safeAreaRect
Also available on the storyboard (“Safe Area Layout Guide”)
New view item in the library: Window Controller with Sidebar (NSWindowController
+ NSSplitController
)
Opting out of the full height sidebar: NSSplitViewItem.allowsFullHeightLayout
- use this when sidebar is typically collapsed, or when you need more space for the toolbar
By default all sidebar icons are colored with user's chosen accent color
Use NSOutlineViewDelegate
method outlineView(_: tintConfigurationForItem:)
to customize
Return an instance of NSTintConfiguration
:
.default
– always uses the system accent color.monochrome
– gray monochromeinit(preferredColor:)
– use this color when default (“rainbow”) accent color is used, but follow the accent color if it’s customizedinit(fixedColor:)
– a fixed color that is always used (e.g. the yellow star in Mail’s VIP folder)
Use sidebar colors to distinguish different sections of the sidebar, or highlight a specific item like the VIP star
Or use monochrome to de-emphasize groups
Toolbars
There’s no longer any special material behind the toolbar items, it’s a uniform part of the content of the window
Works automatically
New toolbar styles, controlled through NSWindow.toolbarStyle
Types of NSWindowToolbarStyle
:
.unified
- the new standard – like in the new versions of system apps
- larger controls, bold icons
- inline title located at the leading edge of the title bar next to the sidebar
- good choice for most windows
.unifiedCompact
- more compressed style
- regular sized controls, smaller toolbar height
- this is what was previously used if the window was configured to hide the title bar
- now supports an optional inline title
- use when user’s focus should be on the content of the window and there aren’t many elements in the toolbar
.preference
- specifically designed for preference windows
- automatic when you’re using
NSTabViewController
with the.toolbar
tab style
.expanded
- what used to be the standard layout of the toolbar
- title is centered on top of the toolbar and can expand across the window
- large button icons with labels below
- use when the window title is long, or the toolbar is heavily populated with items, or when you want to keep existing toolbar layout
.automatic
- default value
- determines the toolbar style based on your window structure
- existing apps linked on older SDKs keep their old layout
Toolbar buttons no longer have a border, a shape only appears when hovering
Controls with text fields show a slight border so that you know where you can click to focus
NSToolbarItem
minSize
& maxSize
properties are deprecated – macOS can automatically give your controls a proper size
You can still use constraints if necessary
New NSWindow.subtitle
property – shows a smaller subtitle under the window title, e.g. the message count in Mail
In .expanded
style it appears next to the title
Controls like back/forward buttons should be put on the leading edge of the title bar, before the title
Set NSToolbarItem.isNavigational
to position them there
Users can add and remove them from the toolbar, but can only put them in the leading edge area
NSSearchToolbarItem
:
- new toolbar control for search text fields
- appears as a text field if there’s enough space, otherwise collapsed into an icon
- use the
searchField
property to access the text field itself - works on older versions of macOS
NSTrackingSeparatorToolbarItem
:
- a separator that extends the separator line of the window content’s split view upwards through the toolbar
- when creating, you pass it the split view to track and the index of its divider
To position items in the title bar area of the sidebar, include an NSToolbarItem.Identifier.sidebarTrackingSeparator
item and add those items *before* the sidebar separator item
The toolbar has no border below, but a slight shadow appears below it to separate it from the content when the content is scrolled
- this happens if the scroll view fills the frame and you’re using
.fullSizeContentView
- otherwise, there will be a separator regardless of the scrolling position
- customize toolbar separator in the window using
NSWindow.titlebarSeparatorStyle
, or in split view per section usingNSSplitViewItem.titlebarSeparatorStyle
Controls
New modern design of controls like popup buttons, sliders, segmented controls
New multicolor system accent color – uses each app’s preferred accent color
Define the app’s global accent color in the asset catalog (can be different for light/dark mode) + set the name in build options
People can still chose one of the previously available accent colors, and then that color overrides your setting so they can use that color everywhere
It’s preferred to use named colors like controlAccentColor
, selectedContentBackgroundColor
, keyboardFocusIndicatorColor
instead of explicitly using your own color for controls
New .large
control size, e.g. when you need one large action button
Works for: a few kinds of buttons, text fields, search fields, segmented controls
Also used in the unified toolbar style, and in system alerts
New inset style for table selection
Adds extra padding, taller default row heights
NSTableView.style
:
.automatic
(default).fullWidth
– edge to edge selection background, like previously.inset
.sourceList
– new appearance of sidebar source list
Automatic style uses .inset
by default (on apps built on the latest SDK), .fullWidth
in bordered scroll views, .sourceList
in source lists
→ you can check the effectiveStyle
property to see what style is actually used
The old SelectionHighlightStyle.sourceList
setting is deprecated
Text
System text styles are now available (Large Title, Headline, Body etc.) – but without Dynamic Type, so they have one constant size
NSFont.preferredFont(forTextStyle: options:)
NSFontDescriptor.preferredFontDescriptor(forTextStyle: options:)
Symbol images
SF Symbols is now available on the Mac
They can scale to different font sizes and weights
Toolbar and sidebar items automatically configure symbol images to match the size & style of the container
NSImage.init?(systemSymbolName: accessibilityDescription:)
It’s best to use them inside NSImageView
(see symbolConfiguration
property)
To customize symbol configuration, use NSImage.withSymbolConfiguration(…)
Most of existing named system images now return some kind of symbol image from SF Symbols