• 3 min read

Restore SwiftUI Menu Icons on macOS 27 with One Line

Missing icons in your macOS 27 menu? SwiftUI now hides most symbol images by default. Here's how Tiny Clips opts its dropdown back in with one scoped label-style modifier.

Real Tiny Clips screenshots, cropped to compare capture-menu icon visibility before and after the label-style change.

Tiny Clips had a nice little dropdown full of icons on macOS 26. On macOS 27, most of those icons disappeared from its SwiftUI MenuBarExtra menu. The labels were still there, but the menu looked quite different.

If your app uses symbol images in SwiftUI menus, you might be seeing the same thing. Before you start replacing your SF Symbols or building an AppKit bridge, check the menu's label style!

Tiny Clips menu on macOS 27 with text-only Screenshot, Copy Text from Region, Record Video, Studio Recording, and Record GIF items.
Before: menu items without visible icons.

Where did the icons go?

This is an intentional default change, not necessarily a missing image or a broken Label.

In the macOS 27 release notes, SwiftUI entry 170480710 explains that menu bar menus and macOS context menus now show a reduced set of images:

  • Symbol images are hidden by default in most contexts.
  • Non-symbol images remain visible, according to the SwiftUI entry.
  • Common system items such as Settings, Share, and Print still get default visible images.

That last detail explains why a menu can look inconsistent: some icons survive even when most of your app's symbols disappear.

Apple recommends reviewing which items actually benefit from images, particularly items representing an object or concept rather than an action. You don't have to opt every menu back in. However, when you do want to preserve an existing icon-driven menu, SwiftUI already has the modifier you need.

The one-line SwiftUI fix

Use .labelStyle(.titleAndIcon) on the content inside MenuBarExtra.

The Tiny Clips implementation PR adds the modifier in mac/TinyClips/TinyClipsApp.swift. The existing content view becomes:

MenuBarContentView(captureManager: captureManager, sparkleController: sparkleController)
    .labelStyle(.titleAndIcon)

That is the whole code change: one added modifier!

Applying the style to the content view sets it for the labels within that hierarchy, rather than changing label styling across the entire app. In Tiny Clips, that scope includes submenu labels and recent-capture labels with thumbnails or symbol fallbacks. It doesn't create images for text-only items.

There is no AppKit bridge, private API, new dependency, or macOS version branch. The existing actions, keyboard shortcuts, and platform guards stay unchanged.

Tiny Clips menu on macOS 27 with camera, text-recognition, video, layers, and image icons beside the capture options, plus icons for folders, recent captures, library, and settings.
After: icons visible alongside the menu labels.

There are the icons!

Does this raise the minimum macOS version?

No, not for Tiny Clips. labelStyle(_:) is available from macOS 11.0, and .titleAndIcon is available from macOS 11.3. Tiny Clips already supports macOS 15.0 and newer, so this change doesn't need an availability check.

Using AppKit instead?

If you create NSMenuItem instances directly, AppKit has a separate preferredImageVisibility property on macOS 27 and newer:

if #available(macOS 27.0, *) {
    menuItem.preferredImageVisibility = .visible
}

Here, menuItem is your existing NSMenuItem. This is the AppKit option, not an extra step for SwiftUI. AppKit's release notes also describe SDK-linkage-dependent image visibility; don't apply those rules to SwiftUI's separate release-note entry.

For a SwiftUI MenuBarExtra like Tiny Clips, start with the supported label-style modifier. A small, scoped change beats replacing your menu just to ask for its icons back.

Happy coding.

James Montemagno
Author

James Montemagno

James Montemagno is a Principal Lead Program Manager for Developer Community at Microsoft. He has been a .NET developer since 2005, working in a wide range of industries including game development, printer software, and web services. Live, Love, Bike, and Code.

Milli the dog peeking up from the bottom of the page