Apple的黑暗模式已经横空出世很久国内蓝绿大厂也已经迎头赶上,大家已经吃到macOS下五彩斑斓的黑然鹅很多App依然没有适配出五彩斑斓的黑。比如楼主自己的Mac下视频App依然没有适配五彩斑斓的黑当开启黑暗模式下很多不忍直视的画面,例如
通常模式
黑暗模式
看到这样的情况你是否感觉很违和,是的的确很违和。所以我们今天就来聊聊怎么适配这种根据系统的调整来适配这种黑暗模式。
说起匹配黑暗模式我们不得不说一个基本知识点:
无论您是做iOS亦或者macOS的App开发,有一个类是用用来控制App的UI表现的那就是---UIApperance / NSApperance。当然了iOS下的apperance功能更加强大,强大到可一个对每一类UI组件来指定对应的表现,然鹅macOS下这个限制就比较多……
今天我们那macOS下做例子,先看一个怎么设置全局控制而不让App随操作系统来更改:
func applicationDidFinishLaunching(_ aNotification: Notification) {
// Insert code here to initialize your application
NSApp.keyWindow?.appearance = NSAppearance.init(named: NSAppearance.Name.vibrantLight)
}
假如您没走好适配黑暗模式的准备,那么就这一行代码搞定,从此你的App将不会跟随OS系统来变更模式。
好了说了这么多,在说起黑暗模式之前我们先来看看Apple为我们提供了哪些方式:
1 通过代码来实现
2 通过xib配置来实现
我们下面分开从一个label的文字到图片的展示来说起。您会问为啥?因为这个是两种不同的资源
我们先看一下对于Color
系统给我们提供了默认三种模式:Any Light Dark,当我们从asset中加载摸个颜色资源时系统会判断当前mode。那么您会问怎么变更表现?为啥会变更表现?其实很简单您只需要开发的时候打个断点就一目了然啦。当然了这个断点是有需要的。应为啊切换时App会发生更新(位置啊,ui刷新啊,约束变更啊)……
然后是Image
原理跟Color类似,不过啊,不同的是Image可以在XIB上设置,而Color往往需要编码
override func viewWillLayout() {
let textColor = NSColor.init(named: NSColor.Name.init("labelTextColor"))
self.label.textColor = textColor
}
下面我们我们说一下采用代码的方式:一般来说需要放到需要随系统更新的地方,我们获取当前系统的mode然后加载对应的代码即可
NSApp.appearance
extension NSAppearance.Name {
@available(OSX 10.9, *)
public static let aqua: NSAppearance.Name
@available(OSX 10.14, *)
public static let darkAqua: NSAppearance.Name
@available(OSX, introduced: 10.9, deprecated: 10.10, message: "Light content should use the default Aqua apppearance.")
public static let lightContent: NSAppearance.Name
/* The following two Vibrant appearances should only be set on an NSVisualEffectView, or one of its container subviews.
*/
@available(OSX 10.10, *)
public static let vibrantDark: NSAppearance.Name
@available(OSX 10.10, *)
public static let vibrantLight: NSAppearance.Name
/* The following appearance names are for matching using bestMatchFromAppearancesWithNames:
Passing any of them to appearanceNamed: will return NULL
*/
@available(OSX 10.14, *)
public static let accessibilityHighContrastAqua: NSAppearance.Name
@available(OSX 10.14, *)
public static let accessibilityHighContrastDarkAqua: NSAppearance.Name
@available(OSX 10.14, *)
public static let accessibilityHighContrastVibrantLight: NSAppearance.Name
@available(OSX 10.14, *)
public static let accessibilityHighContrastVibrantDark: NSAppearance.Name
}