返回

Color(for state: UIControl.State) -> UIColor? { return .red } } } ``` ### 优点和缺点 使用 `UIAppearance` 协议的主要优点在于它可以方便地统一修改整个 app 中特定控件类型的默认外观,而无需修改每个控件的实例属性。此外,它还可以简化代码,使代码更易于维护。 但是,`UIAppearance` 协议也有一些缺点。首先,它只适用于少数特定的控件类型。其次,它可能会导致意外的行为,因为控件的外观可能会受到多个外观代理的影响。最后,它可能会使调试变得更加困难,因为很难确定控件的外观是由哪个外观代理设置的。 ### 总结 `UIAppearance` 协议是一种强大的工具,可以方便地统一修改整个 app 中特定控件类型的默认外观。但是,在使用它时需要注意它的优点和缺点,以避免意外的行为和调试困难。 UIAppearance:轻松统一修改控件外观

IOS

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 中特定控件类型的默认外观。但是,在使用它时需要注意它的优点和缺点,以避免意外的行为和调试困难。