Color(for state: UIControl.State) -> UIColor? { return .red } } } ``` ### 优点和缺点 使用 `UIAppearance` 协议的主要优点在于它可以方便地统一修改整个 app 中特定控件类型的默认外观,而无需修改每个控件的实例属性。此外,它还可以简化代码,使代码更易于维护。 但是,`UIAppearance` 协议也有一些缺点。首先,它只适用于少数特定的控件类型。其次,它可能会导致意外的行为,因为控件的外观可能会受到多个外观代理的影响。最后,它可能会使调试变得更加困难,因为很难确定控件的外观是由哪个外观代理设置的。 ### 总结 `UIAppearance` 协议是一种强大的工具,可以方便地统一修改整个 app 中特定控件类型的默认外观。但是,在使用它时需要注意它的优点和缺点,以避免意外的行为和调试困难。 UIAppearance:轻松统一修改控件外观
2023-12-26 21:27:36
UIAppearance 入门指北
什么是 UIAppearance?
在 UIAppearance 出现之前,开发者如果想统一修改 app 内某一个控件的 UI 样式时,只能通过去修改每个控件的实例属性,对于只有几个实例的 UI 控件来说,这样的修改还可以接受,但如果整个 app 中有几十个,甚至上百个实例的时候,这样的修改就显得相当笨拙了。
当然,一些有经验的开发者会使用代码生成或者直接修改控件的 class
样式表的方式来达到统一样式的目的,但这样做仍然不能完全解决问题,而且一旦控件的类发生了改变,或者我们想要对其中一部分控件进行单独的样式修改时,仍然需要对每个控件的实例进行单独的修改。
为了解决上述问题,iOS 5 中引入了 UIAppearance
协议。UIAppearance
协议提供了一种轻量级的机制,允许开发者在不修改控件实例属性的情况下,修改整个 app 中特定控件类型的默认外观。
使用 UIAppearance
要使用 UIAppearance
协议,你需要创建一个控件的外观代理,并通过 appearanceWhenContainedInInstancesOfClasses
方法指定要修改的外观,然后通过 setAppearance:
方法设置控件的外观。
例如,要修改所有 UIButton
的标题颜色,可以这样写:
extension UIButton {
@objc public static func appearanceWhenContainedInInstancesOfClasses() -> UIButton.Appearance {
return Appearance()
}
public class Appearance: UIButton.Appearance {
public override func titleColor(for state: UIControl.State) -> UIColor? {
return .red
}
}
}
优点和缺点
使用 UIAppearance
协议的主要优点在于它可以方便地统一修改整个 app 中特定控件类型的默认外观,而无需修改每个控件的实例属性。此外,它还可以简化代码,使代码更易于维护。
但是,UIAppearance
协议也有一些缺点。首先,它只适用于少数特定的控件类型。其次,它可能会导致意外的行为,因为控件的外观可能会受到多个外观代理的影响。最后,它可能会使调试变得更加困难,因为很难确定控件的外观是由哪个外观代理设置的。
总结
UIAppearance
协议是一种强大的工具,可以方便地统一修改整个 app 中特定控件类型的默认外观。但是,在使用它时需要注意它的优点和缺点,以避免意外的行为和调试困难。