淺嘗UIAppearance的使用

weixin_33670713發表於2016-06-21

相信細心的大家會注意到UIView類中遵守了一個開放的協議UIAppearance,於是作者抽時間做了一些小的嘗試。由於工作使用的是swift語言,因此給出的例項也是用swift寫的。

 public protocol UIAppearance : NSObjectProtocol

首先來看看該協議中都有哪些方法。

 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物件,進而可以設定一些全域性的屬性,一經設定,那麼當前該種檢視上的所有該種子檢視的這一屬性都將被設定。比如要實現新增到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的協議中,該協議預設被UIView與UIViewController等遵守.。可以直接通過View或者controller的traitCollection屬性獲取該物件。如果沒有指定某一控制元件的traitCollection屬性,那麼將使用其父控制元件的traitCollection屬性值。

下面是根據第三個方法所做的一個小示例。

 UIView.appearanceForTraitCollection(UIView().traitCollection).backgroundColor = UIColor.redColor() //這句程式碼會將所有UIView型別的檢視的背景色設定成紅色,當然這句程式碼也寫在了AppleDelegate裡的didFinishLaunchingWithOptions方法中。

寫到這裡,對於第四個方法,大家只要看一下其方法名,就能猜測出是對方法二和方法三的一個綜合,返回的仍是appearance物件,只不過需要兩種型別的引數,而這兩種型別正是方法二與方法三所需要的引數型別,這裡就不再做測試,如果有興趣,可以親自去嘗試一下。

相關文章