相信細(xì)心的大家會(huì)注意到UIView類中遵守了一個(gè)開(kāi)放的協(xié)議UIAppearance,于是作者抽時(shí)間做了一些小的嘗試。由于工作使用的是swift語(yǔ)言,因此給出的實(shí)例也是用swift寫的。
public protocol UIAppearance : NSObjectProtocol
首先來(lái)看看該協(xié)議中都有哪些方法。
1.public static func appearance() -> Self
2.public static func appearanceWhenContainedInInstancesOfClasses(containerTypes: [AnyObject.Type]) -> Self
3. public static funcappearanceForTraitCollection(trait: UITraitCollection) -> Self
4.public static func appearanceForTraitCollection(trait: UITraitCollection, whenContainedInInstancesOfClasses containerTypes: [AnyObject.Type]) -> Self
對(duì)于第一個(gè)方法,就是獲取某一種視圖類的appearance對(duì)象,通過(guò)該對(duì)象可以設(shè)置一些對(duì)全局有效的屬性,比如我們平時(shí)可能經(jīng)常設(shè)置的tintColor,backgroundColor屬性等。如果我們要修改UINavigationBar的tintColor屬性,我們可以將下列代碼寫在AppleDelegate里的didFinishLaunchingWithOptions方法里。
UINavigationBar.appearance().tintColor = UIColor.yellowColor()
但是這里有一點(diǎn)需要注意的是使用appearance設(shè)置UI效果最好采用全局的設(shè)置,在所有界面初始化前開(kāi)始設(shè)置,否則可能失效。
第二個(gè)方法的大體用法是獲取一個(gè)視圖類中某種視圖的appearance對(duì)象,進(jìn)而可以設(shè)置一些全局的屬性,一經(jīng)設(shè)置,那么當(dāng)前該種視圖上的所有該種子視圖的這一屬性都將被設(shè)置。比如要實(shí)現(xiàn)添加到UIView上的Button的背景色都設(shè)置成黃色,代碼如下。
UIButton.appearanceWhenContainedInInstancesOfClasses([UIView().dynamicType]).backgroundColor = UIColor.yellowColor()
//這里需要說(shuō)明的是,在swift中并沒(méi)有像OC當(dāng)中的那樣通過(guò)[object class]獲取到類對(duì)象,不過(guò)在swift中我們可以通過(guò)object.dynamicType獲取對(duì)象的類。
對(duì)于第三個(gè)方法,是iOS8.0后添加的方法,該方法的參數(shù)類型是UITraitCollection,返回的仍然是一個(gè)appearance對(duì)象,對(duì)于該種類型的參數(shù),作者也沒(méi)有過(guò)于深入的研究,這里只是簡(jiǎn)單的的理解。UITraitCollection是iOS8.0新推出的一個(gè)類,這個(gè)類封裝了像水平和豎直方向的 Size Class 等信息。該類型的對(duì)象是定義在一個(gè)名字為UITraitEnvironment的協(xié)議中,該協(xié)議默認(rèn)被UIView與UIViewController等遵守.??梢灾苯油ㄟ^(guò)View或者controller的traitCollection屬性獲取該對(duì)象。如果沒(méi)有指定某一控件的traitCollection屬性,那么將使用其父控件的traitCollection屬性值。
下面是根據(jù)第三個(gè)方法所做的一個(gè)小示例。
UIView.appearanceForTraitCollection(UIView().traitCollection).backgroundColor = UIColor.redColor() //這句代碼會(huì)將所有UIView類型的視圖的背景色設(shè)置成紅色,當(dāng)然這句代碼也寫在了AppleDelegate里的didFinishLaunchingWithOptions方法中。
寫到這里,對(duì)于第四個(gè)方法,大家只要看一下其方法名,就能猜測(cè)出是對(duì)方法二和方法三的一個(gè)綜合,返回的仍是appearance對(duì)象,只不過(guò)需要兩種類型的參數(shù),而這兩種類型正是方法二與方法三所需要的參數(shù)類型,這里就不再做測(cè)試,如果有興趣,可以親自去嘗試一下。