Ios 我有UIView扩展,在这个扩展中,我有一个方法setDarkModeColor每次初始化视图时如何调用
我在扩展中有一个函数,在黑暗模式和光明模式下更改我的视图背景颜色,每次初始化视图时我都需要调用这个方法 我的代码如下:Ios 我有UIView扩展,在这个扩展中,我有一个方法setDarkModeColor每次初始化视图时如何调用,ios,swift,ios13,Ios,Swift,Ios13,我在扩展中有一个函数,在黑暗模式和光明模式下更改我的视图背景颜色,每次初始化视图时我都需要调用这个方法 我的代码如下: extension UIView{ func setDarkModeColor() { if #available(iOS 12.0, *) { if self.traitCollection.userInterfaceStyle == .light{ if sel
extension UIView{
func setDarkModeColor() {
if #available(iOS 12.0, *) {
if self.traitCollection.userInterfaceStyle == .light{
if self.backgroundColor == UIColor.black{
self.backgroundColor = .white
}
}else{
if self.backgroundColor == UIColor.white{
self.backgroundColor = .black
}
}
} else {
// Fallback on earlier versions
}
}
}
关于在扩展中重写:
您应该找到另一种方法:(您不应该更改标准UIView或任何未编写或未拥有的类的默认行为。至少,扩展不是这样做的地方。尽管有可能,但重写扩展中的现有函数是非常糟糕且极不鼓励的做法 相反,您应该重写UIView():
不能。不能使用扩展导致调用方法。可以使用扩展注入此方法,但必须在每个UIView中显式地自己调用 无论如何,你不需要这种方法。如果你想给UIView一个响应暗/光模式的背景色,那么给它一个响应暗/光模式的背景色。在iOS 13中,颜色具有这种能力;以这种方式配置的颜色将自动响应暗/光模式。你可以创建这样一种颜色作为命名颜色在资产目录中,也可以通过调用
init(dynamicProvider:)
在代码中构造它。例如:
let myCoolColor = UIColor { tc in
switch tc.userInterfaceStyle {
case .dark:
return UIColor(red: 0.3, green: 0.4, blue: 0.4, alpha: 1)
default:
return UIColor(red: 0, green: 0.1, blue: 0.1, alpha: 1)
}
}
如果您将
myColColor
指定为视图的背景色,则颜色将根据用户的模式自动更改。您应该在每个视图上为每个背景添加特定的颜色,就像Apple建议的那样(一个用于暗模式,一个用于亮模式):。当您在模式之间切换时,操作系统将自动进行更改。是的,我们可以使用这种方法,但在激动人心的应用程序中,我们可以遵循这个过程,然后是漫长的过程。因此,我认为如果我们使用扩展,那么这种方法会更好。您还可以创建UIView的子类并重写init语句,以确保调用此方法。@Leo Y我们可以这样做,但它改变了所有swift文件、故事板和Xib。所以这可能是一个漫长的过程。所以我们可以使用扩展找到最佳解决方案。
class MyView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
setDarkModeColor()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setDarkModeColor()
}
func setDarkModeColor() {
}
}
let myCoolColor = UIColor { tc in
switch tc.userInterfaceStyle {
case .dark:
return UIColor(red: 0.3, green: 0.4, blue: 0.4, alpha: 1)
default:
return UIColor(red: 0, green: 0.1, blue: 0.1, alpha: 1)
}
}