在iOS 5之后胸墙,出現(xiàn)了兩個Protocol我注,分別是
UIAppearance
以及UIAppearanceContainer
,通過這兩個協(xié)議迟隅,我們可以在開發(fā)過程中規(guī)范對于UI的定制工作但骨。
使用這兩個Protocol,不僅可以簡單更改定制各種外觀樣式智袭,甚至還能制定出現(xiàn)在特定位置
的時候才允許設(shè)置不同的UI外觀特性奔缠。
UIAppearance Protocol主要使用一下兩個方法:
+ (instancetype)appearance;
+ (instancetype)appearanceWhenContainedIn:(nullable Class <UIAppearanceContainer>)ContainerClass, ... NS_REQUIRES_NIL_TERMINATION NS_DEPRECATED_IOS(5_0, 9_0, "Use +appearanceWhenContainedInInstancesOfClasses: instead") __TVOS_PROHIBITED;
iOS 9之后,第二個方法替換為:
+ (instancetype)appearanceWhenContainedInInstancesOfClasses:(NSArray<Class <UIAppearanceContainer>> *)containerTypes NS_AVAILABLE_IOS(9_0);
使用之后吼野,返回值接受者為使用此方法的實例校哎,很多的UIView或者UIControl的屬性都支持此項操作,比如 UIButton的TitleColor:
- (void)setTitleColor:(nullable UIColor *)color forState:(UIControlState)state UI_APPEARANCE_SELECTOR; // default if nil. use opaque white
以及UIview的BackgroundColor:
@property(nullable, nonatomic,copy) UIColor *backgroundColor UI_APPEARANCE_SELECTOR; // default is nil. Can be useful with the appearance proxy on custom UIView subclasses.
上面兩個例子箫锤,大家可以看出贬蛙,只有標(biāo)記了UI_APPEARANCE_SELECTOR
宏定義的方法雨女,才會遵循UIAppearance Protocol,并允許使用協(xié)議方法阳准。
使用范例:
[[UINavigationBar appearance] setBarTintColor:myNavBarBackgroundColor];
或者
[[UIBarButtonItem appearanceWhenContainedIn:[NSArray arrayWithObject:[UINavigationBar class]]
setBackgroundImage:[UIImage imageNamed:@"imageName"] forState:state barMetrics:metrics];
只要是遵循了UIAppearanceContainer Protocol
的類氛堕,比如UINavigatorBar
、UIPopOverController
等野蝇,都是此容器類讼稚,可以使用協(xié)議中的方法。
參考資料: