一、前言
- 我們經(jīng)常設(shè)置UINavigationBar、UITabBar等主題,我們有沒有想過,為什么我們可以給它們設(shè)置主題屬性呢?你可能回答是系統(tǒng)提供了這些主題,對,但是,又是那些對象,可以設(shè)置主題屬性呢?
二、主題設(shè)置的前提
1. 那些控件和類,可以設(shè)置主題呢?
- 回答:
只要遵守了UIAppearance協(xié)議的類,都可以設(shè)置主題-
查看UIView的頭文件,可得,UIView可以設(shè)置主題,那么不是所有繼承UIView的控件就都可以設(shè)置主題了嗎?是的
Snip20150901_10.png -
觀看可得,不僅,只是控件可以設(shè)置主題,UIBarItem等只要遵守了UIAppearance協(xié)議的類,都可以設(shè)置主題
Snip20150901_11.png
-
2.遵守UIAppearance協(xié)議的類的,那些屬性可以設(shè)置主題呢?
- 通過主題對象設(shè)置屬性的前提:
屬性后面是否帶有UI_APPEARANCE_SELECTOR的方法- 因為并不是所以屬性可以設(shè)置主題,設(shè)置主題屬性是有前提的
- 查看頭文件可得,可以設(shè)置UITabBarItem類,發(fā)現(xiàn)setTitleTextAttributes:可以設(shè)置UITabBarItem文字主題
- (void)setTitleTextAttributes:(NSDictionary *)attributes forState:(UIControlState)state
NS_AVAILABLE_IOS(5_0) UI_APPEARANCE_SELECTOR;
- 案例:設(shè)置所有的UITabBarItem,普通與選中狀態(tài)下的文字顏色

Snip20150901_8.png
三、運用主題appearance,是否會生效,何時會生效
1、主題會生效:先設(shè)置控件主題,后添加控件,
- 添加控件時,添加的那一刻會檢查主題,會根據(jù)主題設(shè)置控件 =》主題會生效
2、主題不會生效:先添加控件,后設(shè)置主題
- 控件已經(jīng)添加,后設(shè)置主題,對以前的添加的控件不起作用了
- 如果,先添加控件,后設(shè)置主題,主題失效,我們該如何解決呢?
3、如何解決主題失效問題
- 方案1 :將控件所在控制器的View從窗口移除,因為主題已經(jīng)確定了,再將控件所在控制器的View添加到窗口上 =》 此時主題就起作用了。

Snip20150901_18.png
- 缺點:擴展性不好,因為這樣不能解決所有控制器上的控件的主題
- 方案2:獲取到應用的windows數(shù)組,然后遍歷,將view刪除,然后添加上即可
- 注意:
控件是否銷毀,要看是否有強指針指向它
Snip20150901_20.png
- 注意:


