A UI control shown in the Touch Bar on supported models of MacBook Pro.
- macOS 10.12.2+
An instance of the
NSTouch class is called an item. It appears to the user on the Touch Bar, typically along with other items, within the (invisible) bounds of the view for an
NSTouch object, called a bar.
You use an item by adding it or its identifier to one or another of a bar’s arrays, depending on your app’s architecture and on the user customization you want to support. Because of the close interaction between bars and items, be sure you have read the overview for the
NSTouch class before continuing here to learn about items.
AppKit provides a rich set of subclasses of
NSTouch, each of which is described in the corresponding class reference document:
NSCandidateobject (a candidate-list item), along with its delegate, provides a list of textual suggestions for the current text view
List Touch Bar Item
NSColorobject (a color picker item) provides a system-defined color picker
Picker Touch Bar Item
NSGroupobject (a group item) provides a bar to contain other items
Touch Bar Item
NSPopoverobject (a popover item) provides a two-state control that, when touched or pressed, expands into its second state, showing the contents of a bar it owns
Touch Bar Item
NSSharingobject (a sharing service picker item), along with its delegate, provides a list of objects eligible for sharing
Service Picker Touch Bar Item
NSSliderobject (a slider item) provides a slider control for choosing a value in a range
Touch Bar Item
Refer to the following sample code projects which demonstrate how to use
NSTouch and related classes:
NSTouchBar Catalog—Shows how to create bars and items for use in the Touch Bar
ToolBar Sample—Shows how to add Touch Bar support to a typical Mac app
See Using Template Images for a list of template images available for use in buttons or in other controls you add to your items.
You typically use a custom item (an instance of the
NSCustom class) to hold a view. For example, to place a button in the Touch Bar, proceed as follows:
A popover item (an instance of the
NSPopover class)—the second commonly-used type—lets you provide a new bar (an
NSTouch object) when a user taps, or presses-and-holds, on the collapsed representation of the popover item.
In its expanded state, a popover appears as an overlay above other items in the Touch Bar.
To show a bar when a user taps a popover item, specify a bar in the item’s
popover property. Enable press-and-hold by specifying a bar in the
press property. The press-and-hold feature is suitable only for a simple popover, such as one that contains a single segmented control (an instance of the
NSSegmented class) or slider (an instance of the
The system automatically shows a chevron in the popover item under the following conditions: You specify the same
NSTouch object for both
popover properties, and you use the default view for the popover item’s
If you provide a popover item that contains a scrubber (an
NSScrubber instance), you’ll likely want to dismiss both the scrubber and the popover after the user makes their selection in the scrubber. A good approach to achieve this user interaction is to subclass
NSPopover, employing your instance of the subclass as the scrubber’s delegate. You can then configure the delegate object, within its
did method, to call the popover’s
If you place a segmented control in a bar for a popover item, take care not to use
NSSegmented option of the
NSSegmented enumeration because doing so interferes with the user’s operation of the control.
Other Common NSTouchBarItem Types
To provide a slider item, always use the
NSSlider class, which employs a standard slider but is optimized for user interaction with the Touch Bar. (That is, do not instead add an
NSSlider object directly to a custom item.)
A group item (an instance of the
NSGroup class) is a container that provides a bar, in its
group property, with its own array of items. You can enable customization for the items in a group’s contained bar, in the same way you would for items directly within a top-level bar. Using a group item lets you provide different user customization rules for different parts of the Touch Bar, as described in Group Item, Popover Item, and Composed Bar Customization. Using a group item also lets you enable centering of the group within the Touch Bar, as described in “Principal Items.”
A spacing item lets you add custom spacing between items in a bar. Specify a spacing item for a bar by assigning the
flexible identifier to an item, and adding that item to the bar’s items array. The system automatically instantiates and configures spacing items based on the identifiers you specify.
You must configure each item with a unique identifier, and can optionally assign a visibility priority or tag it as a principal item.
NSTouchBarItem identification. You must provide a unique identifier for each item in the bar, apart from spacing items. Specify an identifier, of type
NSTouch (called an item identifier), for each item when you initialize it. The item identifier serves as a persistable weak reference to the item.
The system uses item identifiers to populate bars and to track and record changes for user customization.
NSTouchBarItem priority for visibility. If the system is showing a bar in the Touch Bar, but horizontal space is constrained and the bar defines more items than will fit, the system hides some of the items. You influence this hide/show behavior by setting a value for the
visibility property of each item.
Lower-visibility-priority items get hidden by the system, as needed, before higher-visibility-priority items do.
To set visibility priority, use the constants in the
NSTouch enumeration, or assign an integer value. The value
0 indicates “normal” visibility priority. Visibility priority increases with increasing numerical value. The
low constant provides a value of
high constant, a value
+1000. You can use integers outside of this range if you need to.
The system hides or shows groups of identical-priority items (defined within a single bar) together. The one exception to this rule is for items whose visibility priority is
normal; these items get hidden one-by-one, with the normal-priority item farthest to the right getting hidden first. If horizontal space later increases in the Touch Bar, and hidden, normal-priority items become eligible for display, the system first shows the most recently-hidden of those items.
Principal Items. Within a bar, you can optionally specify an item as having special significance by employing the
principal property. The system attempts to center a principal item within the Touch Bar. If you want a group of items to appear centered in the Touch Bar, designate the group item (of type
NSTouch) as the principal item.
If more than one bar in the responder chain is eligible to be visible in the Touch Bar, and more than one of those has a principal item, the system determines which one to center in the Touch Bar.
NSTouchBarItem Fonts, Images, and Colors
When using a button in a custom item, do not attempt to set the button title’s font. In the Touch Bar, the system specifies fonts for standard controls.
If you need to specify a font, such as for custom drawing, use the
system class method (or related methods) of the
NSFont class. Use a font size of
0 to automatically obtain appropriate sizing for the Touch Bar.
If you use an image in a button or other control in the Touch Bar, take care to employ a template image. Template images in the Touch Bar respond automatically to system white-point changes, and automatically react to user interactions. The overview in this document lists the built-in Touch Bar template images.
To use your own image assets, use Retina-resolution images, designated as
@2x in your asset catalog and with a maximum height of 30 points (corresponding to 60 pixels).
To set colors on objects within an
NSTouch object, use AppKit named colors and use a bezel color property (available starting in macOS 10.12.1). Named colors appear correctly in the Touch Bar, support appearance vibrancy, and respond to system white-point changes. In a button or a segmented control, employ the bezel color property to ensure appropriate appearance in the Touch Bar.
To set the background color on a button within a custom item, use code like this:
To set color on text and glyphs in the Touch Bar, use the following colors from the
The system automatically changes the relative brightness and the white-point of these colors, depending on the ambient light, and depending on other factors such as keyboard backlight level. Always use these colors, or colors that dynamically derive from these colors, for control backgrounds, text, icons, and glyphs in the Touch Bar.
Handling Touch Events in NSTouchBarItem Objects
The easiest way to handle touch events in an item is to use AppKit controls, such as by adding a button, a segmented control, or a scrubber to the item. Standard AppKit controls convey touch events to your specified targets automatically, so use standard controls whenever possible in your app.
If standard controls are insufficient, you can create composite views with a combination of standard controls, custom views, and gesture recognizers that you manually add to those custom views.
If you require the lowest-level of control for touch event processing, you can use the
NSTouch class directly. You might go this route, for example, to provide good user feedback in the case of a control placed within a scroll view.Direct use of touch methods allows fine-grained control over interaction. You can, for example, highlight a control immediately upon a user touching it, and then remove the highlight if the user then, without lifting the finger, performs a scroll gesture.
macOS 10.12.1 supports the Touch Bar with enhancements to gesture recognizers, as described in “Gesture recognizer support” in AppKit Support for the Touch Bar. For an introduction to gesture recognizers, read “Gesture Recognizers” in Event Handling Guide for UIKit Apps, most of whose guidance pertains as well to macOS, and watch What’s New with Gestures.
macOS 10.12.1 also supports Touch Bar with improvements to touch objects, as described in ”Touch changes” in AppKit Support for the Touch Bar.