這是一個很重要的protocol,而且它的代理類是UIView和UIBarItem等,UIView和UIBarItem是比較偏底層的父類,很多常用的UI系控件都繼承了它們中某一個,如UIButton、UILabel、UINavigationBar、UIBarButtonItem。(網上相關資料也不多)
因為這個有個很吸引人的是實例方法
/**
自定義一個類的所有實例的外觀,外觀修改相關信息發送到外觀的代理類。注意iOS7:UIView iOS7 tintColor屬性已經,現在有特殊遺傳行為UIView.h中描述。這種繼承的行為可以用外表代理沖突,因此tintColor現在不允許出現代理。
**/
+ (instancetype)appearance;
現在來說說使用它的好處了
優點1:可以少碼很多代碼,節省開發時間,規范代碼。
我們在創建一個類的時候會寫很多相同的屬性設置代碼。比如一個UILabel的BackgroundColor設置,這個對設計師來說,他們一般都是設計背景色透明的,不同的iOS版本它的默認背景色有區別( iOS6默認是白色)的,一般我們在寫的時候會加上一句代碼 設置背景為透明。如果有N個控件
那我們可能要加近N出地方。
[[UILabel appearance] setBackgroundColor:[UIColor clearColor]];
使用這么一句代碼就能搞定
優點2:在滿足需求時,盡可能少的使用自定義控件,性能也會相對好一點
不同的app會有不同的風格,如UINavigationBar、UITabBar等的樣式變化,UINavigationBar可能網上講的方法比較多,這邊就拿UITabBar來說一下吧。比如最近開發中遇到的一件事 設計看到Instagram app的底部TabBar是只有顯示圖片,并且高度只有44px,這與我們正常認知TabBar高度是49px有差異,第一直覺告訴我們Instagram底部狀態欄是自定義實現的!但經常使用appearance,第二反應我是否可以通過它來實現。經過實踐用一段簡單的代碼就完成了。
[[UITabBar appearance] setFrame:CGRectMake(0, SCREEN_HEIGHT-44, SCREEN_WIDTH, 44)];
//如果圖片的位置需要調整 可使用下面的代碼 具體位置可通過調值改變
[[UITabBarItem appearance] setImageInsets:UIEdgeInsetsMake(5, 0, -5, 0)];
看完這個后,是不是覺得換UITabBar可以很方便,很簡單。而且用系統的實現方式心里也有底,性能也比自定義實現的好多了。
優點3:代碼易管理,易迭代,在設計風格出現變動的時候可以快速的響應
因為你對整個app風格可以在一處地方可以實現,想要改動的時候自然輕松的多。如TableView的背景色設置,cell的按下狀態顏色設置等等
[[UITableView appearance] setBackgroundColor:[UIColor whiteColor]];
UIView *cellSelectedBgView = [UIView new];
cellSelectedBgView.backgroundColor = [UIColor yellowColor];
[[UITableViewCell appearance] setSelectedBackgroundView:cellSelectedBgView];