iOS OC UIAppearance

在看一些第三方框架的時候發(fā)現(xiàn)了一些使用appearance方法的,于是就研究了一下,覺得還是挺有趣的:

1.關于Appearance:

@protocol UIAppearance <NSObject>
UIAppearance本身是一個協(xié)議,在協(xié)議中有以下幾種方法:
// 初始化方法,支持遵守UIAppearance協(xié)議的類,可以直接初始化出對應類,再進行屬性修改
+ (instancetype)appearance;
// 在指定類中修改屬性,后面跟class,(最后跟一個nil),這行代碼以后在指定類中創(chuàng)建的對象就會遵守進行的屬性修改,iOS9被下一個方法替換
+ (instancetype)appearanceWhenContainedIn:(nullable Class <UIAppearanceContainer>)ContainerClass, ... NS_REQUIRES_NIL_TERMINATION NS_DEPRECATED_IOS(5_0, 9_0, "Use +appearanceWhenContainedInInstancesOfClasses: instead") __TVOS_PROHIBITED;
// iOS9之后替換上一個方法的,我感覺就是將之前的class,nil變?yōu)橐粋€@[class]的數(shù)組
+ (instancetype)appearanceWhenContainedInInstancesOfClasses:(NSArray<Class <UIAppearanceContainer>> *)containerTypes NS_AVAILABLE_IOS(9_0);
// 在指定狀態(tài)下修改指定對象屬性,比如將在橫屏狀態(tài)和豎屏狀態(tài)下顯示不同顏色
+ (instancetype)appearanceForTraitCollection:(UITraitCollection *)trait NS_AVAILABLE_IOS(8_0);
+ (instancetype)appearanceForTraitCollection:(UITraitCollection *)trait whenContainedIn:(nullable Class <UIAppearanceContainer>)ContainerClass, ... NS_REQUIRES_NIL_TERMINATION NS_DEPRECATED_IOS(8_0, 9_0, "Use+appearanceForTraitCollection:whenContainedInInstancesOfClasses: instead") __TVOS_PROHIBITED;
+ (instancetype)appearanceForTraitCollection:(UITraitCollection *)trait whenContainedInInstancesOfClasses:(NSArray<Class <UIAppearanceContainer>> *)containerTypes NS_AVAILABLE_IOS(9_0);

2. 支持UIAppearance類

 ** 1.UIActivitiIndicatorView**
**  2.UIBarButtonItem**
**  3.UIBarItem**
**  4.UINavgationBar**
**  5.UIPopoverControll**
**  6.UIProgressView**
**  7.UISearchBar**
**  8.UISegmentControll **
**  9.UISlider**
**  10.UISwitch**
**  11.UITabBar**
**  12.UITabBarItem**
**  13.UIToolBar**
**  14.UIView**
**  15.UIViewController**

3. 例子

- (void)viewDidLoad {
    [super viewDidLoad];
    blueView *bView = [[blueView alloc] init];
    redView *rView = [[redView alloc] init];
    [self.view addSubview:bView];
    [self.view addSubview:rView];
    // btn1在設置UIAppearance前添加到bView
    UIButton *btn1 = [[UIButton alloc] init];
    btn1.frame = CGRectMake(100, 100, 50, 50);
    btn1.backgroundColor = [UIColor blackColor];
    [bView addSubview:btn1];

    // btn2在設置UIAppearance前添加到rView
    UIButton *btn2 = [[UIButton alloc] init];
    btn2.frame = CGRectMake(100, 100, 50, 50);
    btn2.backgroundColor = [UIColor blackColor];
    [rView addSubview:btn2];
    
    // btn3在設置UIAppearance后添加到bView
    UIButton *btn3 = [[UIButton alloc] init];
    btn3.frame = CGRectMake(100, 200, 50, 50);
    btn3.backgroundColor = [UIColor blackColor];
    
    // btn4在設置UIAppearance后添加到rView
    UIButton *btn4 = [[UIButton alloc] init];
    btn4.frame = CGRectMake(100, 200, 50, 50);
    btn4.backgroundColor = [UIColor blackColor];
    
    // btn5在設置UIAppearance后添加到rView
    UIButton *btn5 = [[UIButton alloc] init];
    btn5.frame = CGRectMake(100, 300, 50, 50);
    btn5.backgroundColor = [UIColor blackColor];
    [rView addSubview:btn2];

    //設置UIAppearance
    [[UIButton appearanceWhenContainedInInstancesOfClasses:@[[redView class]]] setBackgroundColor:[UIColor greenColor]];
    // 設置UIAppearance后修改btn4的顏色
    btn4.backgroundColor = [UIColor blackColor];
    
    [bView addSubview:btn3];
    [rView addSubview:btn4];
    [rView addSubview:btn5];
}
Paste_Image.png

如圖:

1. 由btn1與btn2對比可知:指定了redView類型的Appearance對redView上的btn產(chǎn)生影響;
2. 由btn1與btn3對比可知:指定了redView類型的Appearance并未對
3. blueView上的btn產(chǎn)生影響;
4. 由btn2與btn4對比可知:在指定Appearance之前修改屬性不會生效,在指定Appearance之后修改對象屬性,會生效;
5. 由btn2與btn5對比可知:指定Appearance前后添加到View上不會影響Appearance的效果;

4. 使用場景:

  1. 一次性指定默寫控件的特性比如自定義tabBarVC的UIBarButtonItem和UIBarItem等;
  2. 一件換膚:根據(jù)拼接的圖片或者文件名,批量刷新UI的圖片等(通過拼接將red_backImage變成blue_backImage);
    具體的代碼有時間寫完再更新謝謝

5. 參考博客,十分感謝作者:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末求厕,一起剝皮案震驚了整個濱河市奥吩,隨后出現(xiàn)的幾起案子逛艰,更是在濱河造成了極大的恐慌名船,老刑警劉巖硝烂,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異曹宴,居然都是意外死亡埂蕊,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門旦装,熙熙樓的掌柜王于貴愁眉苦臉地迎上來页衙,“玉大人,你說我怎么就攤上這事阴绢〉昀郑” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵呻袭,是天一觀的道長眨八。 經(jīng)常有香客問我,道長左电,這世上最難降的妖魔是什么廉侧? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮篓足,結(jié)果婚禮上段誊,老公的妹妹穿的比我還像新娘。我一直安慰自己栈拖,他們只是感情好连舍,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辱魁,像睡著了一般烟瞧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上染簇,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天参滴,我揣著相機與錄音,去河邊找鬼锻弓。 笑死砾赔,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的青灼。 我是一名探鬼主播暴心,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼杂拨!你這毒婦竟也來了专普?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤弹沽,失蹤者是張志新(化名)和其女友劉穎檀夹,沒想到半個月后筋粗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡炸渡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年娜亿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚌堵。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡买决,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吼畏,到底是詐尸還是另有隱情督赤,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布宫仗,位于F島的核電站够挂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏藕夫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一枯冈、第九天 我趴在偏房一處隱蔽的房頂上張望毅贮。 院中可真熱鬧,春花似錦尘奏、人聲如沸滩褥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瑰煎。三九已至,卻和暖如春俗孝,著一層夾襖步出監(jiān)牢的瞬間酒甸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工赋铝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留插勤,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓革骨,卻偏偏與公主長得像农尖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子良哲,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容