ThemeKit 完全指南:为 macOS 应用添加深色模式与自定义主题
ThemeKit 完全指南为 macOS 应用添加深色模式与自定义主题【免费下载链接】ThemeKitmacOS theming library项目地址: https://gitcode.com/gh_mirrors/the/ThemeKitThemeKit 是一款用 Swift 编写的轻量 macOS 主题切换库。一行代码就能让应用支持浅色、深色主题切换还可以让用户用文本文件创建自己的主题。它同时支持 Swift 与 Objective-C 项目兼容 macOS 10.10 及以上版本。你大概率会遇到的三种情况应用做好之后用户说晚上开着黑底白字太刺眼你才想起没有深色模式。或者你想给产品做一个专属配色却发现系统的外观设置只有浅色/深色两档中间没有你的品牌色。再或者有用户希望你开放自定义主题而你不想为此自建一整套换肤机制。这三种情况ThemeKit 都直接给了现成答案。一句话定位与能力速览ThemeKit 做的事只有一件让 macOS 应用的界面资源颜色、渐变、图片、窗口外观跟随当前主题自动变化并把主题的选择权交给应用或用户。能力你能得到什么一行代码换肤应用级切换浅色、深色或跟随系统外观窗口策略控制指定哪些窗口参与主题化全部、指定类、或排除面板主题感知资源颜色、渐变、图片随主题自动变化无需手动刷新系统颜色覆盖替换NSColor.labelColor等命名色让系统控件也跟随主题用户自定义主题用户写一个.theme文本文件即可创建新主题无需重新编译从克隆到换肤的最短路径先把仓库拿到本地浏览示例项目git clone https://gitcode.com/gh_mirrors/the/ThemeKit把 Sources/ 下的源文件加入你的工程或使用 CocoaPods / Carthage 引入然后在AppDelegate的启动回调里应用主题func applicationWillFinishLaunching(_ notification: Notification) { ThemeManager.systemTheme.apply() }systemTheme会跟随系统设置 → 通用 → 外观自动在浅色和深色之间切换。如果你只想固定深色把这一行换成ThemeManager.darkTheme.apply()即可。跑起来之后应用的所有窗口都会按当前主题渲染。核心能力拆解浅色、深色、系统三种内置主题库里预置了LightTheme、DarkTheme和SystemTheme。前两者是固定的浅色与深色外观SystemTheme是一个代理它会实时解析系统外观设置对应到前两者之一。适合谁只想补上深色模式、不想维护多余主题的应用。随主题自动切换的颜色、渐变与图片ThemeColor、ThemeGradient、ThemeImage是三类知道当前主题的资源。你在项目里声明一次资源名运行时它会自动解析成当前主题对应的值。比如给品牌色定义一个扩展extension ThemeColor { objc static var brandColor: ThemeColor { ThemeColor.color(with: #function) } }之后在界面里任何地方使用ThemeColor.brandColor切换主题时颜色自动跟着变不需要自己监听刷新。适合谁有品牌色体系、颜色散落在多个视图里的项目。它还内置了回退机制——主题里没定义某个资源时会依次回退到主题级回退值或库内置默认值不会直接拿不到颜色。让用户写个文本文件就拥有新主题除了代码里定义的Theme协议主题ThemeKit 还支持UserTheme一个.theme纯文本文件。文件里只需几行信息——显示名、唯一标识、是否深色主题再配上若干颜色键值对。例如 Demo 里的 Purple Green 主题标题栏、正文背景、标题文字各占一行想要纸张纹理背景就写一行contentBackgroundColor pattern(named:paper)引用一张纹理图。你只需告诉 ThemeKit 存放这些文件的文件夹userThemesFolderURL主题就会出现在应用的主题列表里。用户主题甚至能用纹理图片做背景做出纸面书写这类效果。适合谁希望把界面个性化交给最终用户的应用。决定哪些窗口参与主题化windowThemePolicy提供四种策略主题化所有窗口、只主题化指定窗口类、不主题化某些窗口类例如NSPanel、或完全不自动主题化。多窗口应用通常用排除面板这种粒度最顺手——主窗口跟主题走浮动工具窗保持系统外观。策略没覆盖到的窗口也可以调用NSWindow扩展里的方法手动主题化。视图如何跟上主题变化切换主题时库会发送willChangeTheme和didChangeTheme通知同时ThemeManager.shared.effectiveTheme等属性支持 KVO。如果你的视图缓存了绘制内容或者用了窗口级独立主题就在通知回调里重绘一次。示例工程 Demo/Demo/ 的主题菜单就是靠监听这个通知来更新勾选状态的。适合谁谁要慎重场景判断macOS 应用需要补深色模式适合接入成本接近一行代码想给用户开放自定义主题适合文本文件方案无需重新编译Swift 与 Objective-C 混编项目适合两种语言都有完整接口iOS 应用换肤不适合这是 macOS 专用库精细控制每个控件的文字/填充颜色有限制原生控件只能部分覆盖系统命名色上手前要知道的三件事控件配色有边界。原生按钮、弹出框等控件的填充色不能任意指定能自由定制的是系统命名色如NSColor.labelColor覆盖它能解决大部分文字着色场景。可用NSColor.colorMethodNames()列出全部可覆盖的颜色。两个已知的视觉细节。老版本 macOS 若开启始终显示滚动条深色主题下滚动条可能发白需要在主题变化时手动设置其背景层自定义绘制文字时务必先铺背景色否则可能遇到字体平滑问题。部署基线。支持 macOS 10.10 以上Swift 5.4 编译Objective-C 工程手动引入时需要一并包含 Swift 相关框架。延伸资料README.md完整功能列表、安装方式与 FAQSources/主题管理器、主题协议与主题感知资源的实现Docs/仓库内置的 API 文档Demo/Demo/可运行的示例应用含主题菜单与标题栏主题化Demo/Themes/现成的.theme用户主题文件macOSThemeKit.podspec版本与依赖声明主题能力做深了容易变成自研框架ThemeKit 的价值在于把这件事压缩到一个可以直接放进工程的轻量库里。看完 Demo 之后再决定接入深度是个稳妥的顺序。【免费下载链接】ThemeKitmacOS theming library项目地址: https://gitcode.com/gh_mirrors/the/ThemeKit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考