相信細心的大家會注意到UIView類中遵守了一個開放的協(xié)議UIAppearance,于是作者抽時間做了一些小的嘗試。由于工作使用的是swift語言,因此給出的實例也是用swift寫的则剃。
public protocol UIAppearance : NSObjectProtocol
首先來看看該協(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
對于第一個方法,就是獲取某一種視圖類的appearance對象,通過該對象可以設置一些對全局有效的屬性,比如我們平時可能經常設置的tintColor,backgroundColor屬性等妓雾。如果我們要修改UINavigationBar的tintColor屬性,我們可以將下列代碼寫在AppleDelegate里的didFinishLaunchingWithOptions方法里颅痊。
UINavigationBar.appearance().tintColor = UIColor.yellowColor()
但是這里有一點需要注意的是使用appearance設置UI效果最好采用全局的設置横侦,在所有界面初始化前開始設置,否則可能失效柬赐。
第二個方法的大體用法是獲取一個視圖類中某種視圖的appearance對象,進而可以設置一些全局的屬性,一經設置,那么當前該種視圖上的所有該種子視圖的這一屬性都將被設置亡问。比如要實現(xiàn)添加到UIView上的Button的背景色都設置成黃色,代碼如下。
UIButton.appearanceWhenContainedInInstancesOfClasses([UIView().dynamicType]).backgroundColor = UIColor.yellowColor()
//這里需要說明的是,在swift中并沒有像OC當中的那樣通過[object class]獲取到類對象,不過在swift中我們可以通過object.dynamicType獲取對象的類肛宋。
對于第三個方法,是iOS8.0后添加的方法,該方法的參數類型是UITraitCollection,返回的仍然是一個appearance對象,對于該種類型的參數,作者也沒有過于深入的研究,這里只是簡單的的理解州藕。UITraitCollection是iOS8.0新推出的一個類,這個類封裝了像水平和豎直方向的 Size Class 等信息。該類型的對象是定義在一個名字為UITraitEnvironment的協(xié)議中,該協(xié)議默認被UIView與UIViewController等遵守.酝陈〈膊#可以直接通過View或者controller的traitCollection屬性獲取該對象。如果沒有指定某一控件的traitCollection屬性,那么將使用其父控件的traitCollection屬性值沉帮。
下面是根據第三個方法所做的一個小示例锈死。
UIView.appearanceForTraitCollection(UIView().traitCollection).backgroundColor = UIColor.redColor() //這句代碼會將所有UIView類型的視圖的背景色設置成紅色,當然這句代碼也寫在了AppleDelegate里的didFinishLaunchingWithOptions方法中。
寫到這里,對于第四個方法,大家只要看一下其方法名,就能猜測出是對方法二和方法三的一個綜合,返回的仍是appearance對象,只不過需要兩種類型的參數,而這兩種類型正是方法二與方法三所需要的參數類型,這里就不再做測試,如果有興趣,可以親自去嘗試一下穆壕。