我经常使用语义颜色在下面的方式,有动态颜色的黑暗模式和光模式。使用这种方法,当用户切换暗/光模式时,颜色也将在运行时更新:
public static var bw100: UIColor = {
if #available(iOS 13, *) {
return UIColor { (UITraitCollection: UITraitCollection) -> UIColor in
if UITraitCollection.userInterfaceStyle == .dark {
// Return the color for Dark Mode
return .black
} else {
// Return the color for Light Mode
return .white
}
}
} else {
// Return a fallback color for iOS 12 and lower.
return .white
}
}()现在,我想对一个Float值做同样的处理,比如有一个语义浮动变量。这意味着我可以为暗模式访问不同的浮点值,对于光模式和,如果用户切换暗/光模式,则该值将在运行时进行调整。我找不到解决办法。
这不工作,因为它不更新运行时。该应用程序必须在暗/光模式切换后重新启动:
public static var myFloat: Float = {
if #available(iOS 13.0, *) {
if UITraitCollection.current.userInterfaceStyle == .dark {
return 0.9
}
else {
return 0.1
}
}
return 0.1
}()--这也不工作(尝试了与上面的工作方法类似的方法),但是这里我得到了一个错误Initializer init(_:) requires that (UITraitCollection) -> Float conforms to BinaryInteger
public static var myFloat: Float = {
if #available(iOS 13, *) {
return Float { (UITraitCollection: UITraitCollection) -> Float in
if UITraitCollection.userInterfaceStyle == .dark {
// Return the Float for Dark Mode
return 0.9
} else {
// Return the Float for Light Mode
return 0.1
}
}
} else {
// Return a fallback for iOS 12 and lower.
return 0.1
}
}()发布于 2020-02-24 10:40:47
您无法实现与UIColor与Float的工作方式相同的功能,因为UIColor有一个特殊的初始化器,直接用于更改接口样式。但是,解决方案仍然相当简单,正如前面提到的,您必须通过实现traitCollectionDidChange(_:)来听取接口样式的更改,并手动重新计算数据。
以下代码将为您实现此功能:
// ViewController.swift
var myStoredFloat: Float = 1.0 {
willSet {
print(newValue)
}
}
var myComputedFloat: Float {
let tc = UITraitCollection.current
let mode = tc.userInterfaceStyle
if #available(iOS 13.0, *) {
return (mode == .light ? 1 : 0)
}
return 1
}
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
self.myStoredFloat = self.myComputedFloat
}当然,如果不依赖于存储的属性,只需使用计算的属性,就可以完全摆脱存储的属性。
*感谢matt的计算属性代码。
发布于 2020-02-24 00:00:56
这对我来说是实时的,而且非常接近你拥有的内容:
static var myFloat : Float {
let tc = UITraitCollection.current
let mode = tc.userInterfaceStyle
if #available(iOS 13.0, *) {
return (mode == .light ? 1 : 0)
}
return 1
}正如Leo指出的,您正在做的和我正在做的事情之间唯一的真正区别是,我有一个计算的属性,它在每次您获取它的值时都会被重新计算,而对于一个在初始化后从未改变的属性,您有一个定义和调用的初始化器。
https://stackoverflow.com/questions/60367756
复制相似问题