? ? ? 今天,是2016年的最后一天了,明天就是2017年了。回想這一年好像做的最多的就是兩件事了,一件是旅游,接下來一件不用說,你們也能猜到,就是擼代碼了。額,好吧,這一年好像過挺單調(diào)的,希望自己在2017年能。。。。。。O(∩_∩)O~,呵呵。
? ? ? OK,切入我們的正題,今天小談一下UIView中tintColor屬性。為什么要談這個(gè)屬性呢?因?yàn)閠intColor屬性是iOS7以后,UIView新添加的屬性,并且這個(gè)屬性還是稍微有點(diǎn)特殊的,因?yàn)樗哂袀鬟f性。舉個(gè)例子,當(dāng)我們用xib或者storyboard拖一個(gè)UIButton進(jìn)入面板后,會發(fā)現(xiàn)UIButton的顏色為藍(lán)色,可能有人會問為什么是這個(gè)顏色呢? 這是因?yàn)?,默認(rèn)情況下,一個(gè)視圖的tintColor為nil,它會使用父視圖tintColor屬性的值。當(dāng)我們?yōu)橹付ㄒ晥DtintColor屬性賦值以后,這個(gè)色值會自動(dòng)傳播到視圖層次結(jié)構(gòu)(以當(dāng)前視圖為根視圖)中所有的子視圖上。如果在視圖層次結(jié)構(gòu)中沒有找到一個(gè)非默認(rèn)的tintColor值,則會使用系統(tǒng)定義的顏色-藍(lán)色,所以這就是為什么我們拖一個(gè)button后顯示的是藍(lán)色了。如圖所示:

那么問題來了,系統(tǒng)提供的默認(rèn)的tintColor的默認(rèn)顏色,我們可以修改嗎?當(dāng)然,如果我們用的storyboard的話,可以在入口控制器的 File Inspector 中修改一下 Global Tint ,如圖所示

可能有人會問用xib和代碼怎么修改呢?xib上修改全局tintColor的屬性還真沒有找到,有知道的可以給我留下言哈。雖然xib不知怎么修改,我們可以通過代碼進(jìn)行修改的,最簡單的情況是你可以通過一行代碼來給整個(gè)APP指定一個(gè)顏色主題:[[UIApplication sharedApplication] keyWindow].tintColor = [UIColor orangeColor];
? ? ? ? 接下來,我們來通過一個(gè)小Demo驗(yàn)證一下,tintColor顏色的性質(zhì)。首先,我們通過storyboard拖一個(gè)UIView為view1進(jìn)入主面板上,然后拖一個(gè)UIButton為button1的按鈕作為view1的子視圖,接著再拖一個(gè)UIView為view2的視圖放在view1的上面,使view2與button1為兄弟關(guān)系(即在同一個(gè)父視圖上),然后在拖進(jìn)一個(gè)UIButton為button2的按鈕作為view2的子視圖,如圖所示:

? ? ? 現(xiàn)在,由于 view1和view2 的 tintColor 都沒有明確指定, 所以它們的 tintColor 都會繼承自最頂層的 UIWindow顏色,也就是藍(lán)色。接著我們修改view1的tintColor的顏色為redColor,然后看下效果,如圖所示:

? ? ? 通過對比可以發(fā)現(xiàn)view1上button1的顏色和view2上button2的顏色都變成了redColor,這可以說明,當(dāng)我們指定了一個(gè)視圖的tintColor后,這個(gè)色值會自動(dòng)傳遞到這個(gè)視圖子視圖的上。接下來,我們再修改一下view2的tintcolor的為yellowColor,看下效果,如圖所示:

? ? ? ? 觀察上圖可以看出,button2的tintColor變成view2設(shè)置的yellowColor。通過上面兩幅圖的對比可以發(fā)現(xiàn),對一個(gè)視圖來說, 如果沒有設(shè)置它的tintColor,那么它會默認(rèn)使用父視圖的tintColor,如果設(shè)置了這個(gè)視圖的tintColor, 那么它就會把這個(gè)tintColor傳遞給沒有設(shè)置tintColor的子視圖。除此之外,與tintColor相關(guān)的還有個(gè)UIViewTintAdjustmentMode類型的tintAdjustmentMode屬性,它是一個(gè)枚舉類型的屬性,定義tintColor屬性的調(diào)整模式,其中UIViewTintAdjustmentModeAutomatic表示視圖的著色調(diào)整模式與父視圖一致,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? UIViewTintAdjustmentModeNormal表示視圖的tintColor屬性返回完全未修改的視圖著色顏色,UIViewTintAdjustmentModeDimmed表示視圖的tintColor屬性返回一個(gè)去飽和度的、變暗的視圖著色。當(dāng)tintAdjustmentMode屬性設(shè)置為Dimmed時(shí),tintColor的顏色值會自動(dòng)變暗。而如果我們在視圖層次結(jié)構(gòu)中沒有找到默認(rèn)值,則該值默認(rèn)是Normal。
? ? ? 與tintColor相關(guān)的還有一個(gè)tintColorDidChange方法,這個(gè)方法會在視圖的tintColor或tintAdjustmentMode屬性改變時(shí)自動(dòng)調(diào)用。另外,如果當(dāng)前視圖的父視圖的tintColor或tintAdjustmentMode屬性改變時(shí),也會調(diào)用這個(gè)方法。