如何在Swift/SwiftUI中检测macOS 26 Tahoe当前选中的应用图标样式?
如何在Swift/SwiftUI中检测macOS 26 Tahoe当前选中的应用图标样式?
嘿,这个问题问到点子上了!在macOS 26 Tahoe中,系统把「图标与小组件样式」的设置存在了全局的UserDefaults里,我们可以直接读取对应的键值来判断当前激活的选项,不用绕复杂的系统API~
首先,我们可以先定义一个枚举来对应系统提供的四个样式,让代码可读性更高:
import Foundation // 对应系统的四个图标与小组件样式 enum IconWidgetStyle: Int, CaseIterable { case `default` = 0 case dark = 1 case clear = 2 case tinted = 3 // 方便获取样式的显示名称 var displayName: String { switch self { case .default: return "Default" case .dark: return "Dark" case .clear: return "Clear" case .tinted: return "Tinted" } } }
接下来写个工具函数就能轻松读取当前的样式:
func getCurrentIconWidgetStyle() -> IconWidgetStyle { let defaults = UserDefaults.standard // 读取系统存储的样式值,读取失败时默认返回Default let styleRawValue = defaults.object(forKey: "com.apple.icon.style") as? Int ?? 0 return IconWidgetStyle(rawValue: styleRawValue) ?? .default }
如果是用SwiftUI开发,还可以用@AppStorage自动监听样式变化,体验更流畅:
import SwiftUI struct IconStyleDemoView: View { // 直接绑定系统的样式存储键,默认值对应Default样式 @AppStorage("com.apple.icon.style") private var iconStyleRawValue: Int = 0 // 计算属性转换为我们定义的枚举类型 private var currentStyle: IconWidgetStyle { IconWidgetStyle(rawValue: iconStyleRawValue) ?? .default } var body: some View { VStack(spacing: 20) { Text("当前图标与小组件样式:\(currentStyle.displayName)") .font(.title) Button("打印当前样式") { print("当前样式:\(getCurrentIconWidgetStyle().displayName)") } } .padding() // 实时监听样式切换 .onChange(of: iconStyleRawValue) { newValue in guard let newStyle = IconWidgetStyle(rawValue: newValue) else { return } print("样式已切换为:\(newStyle.displayName)") } } }
小提醒
- 这个存储键
com.apple.icon.style是macOS 26 Tahoe新增的,目前可以安全读取,但如果未来苹果调整了系统设置的存储逻辑,可能需要更新代码适配。 - 要是用UIKit开发,可以通过监听
UserDefaults.didChangeNotification通知来实时捕获样式变化,效果和SwiftUI的onChange一致。
内容来源于stack exchange
相关产品推荐
相关产品推荐

