iOS 8在應用界面的可視化設計上添加了一個新的特性-Size Classes,對於任何設備來講,界面的寬度和高度都只分爲兩種描述:正常
和緊湊
。這樣開發者即可以無視設備具體的尺寸,而是對這兩類和它們的組合進行適配。這樣不論在設計時仍是代碼上,咱們均可以再也不受限於具體的尺寸,而是變成遵循尺寸的視覺感官來進行適配。在Xcode中的具體體現以下圖:ide
可是咱們看到圖中的寬度和高度都是Any
,Any是什麼意思呢?若是weight
設爲Any
,height
設置爲Regular
,那麼在該狀態下的界面元素在只要height
爲Regular
,不管weight
是Regular
仍是Compact
的狀態中都會存在。這種關係應該叫作繼承關係,具體的四種界面描述與可繼承的界面描述以下:佈局
咱們知道了iOS 8下面設備界面能夠描述爲4種,可是這麼多設備(iPhone4S,iPhone5/5s,iPhone6,iPhone6 Plus,iPad,Apple Watch)具體對應什麼描述呢?通過查看官方文檔和具體實踐得知具體對應關係以下:動畫
爲了表徵Size Classes
,Apple在iOS8中引入了一個新的類,UITraitCollection
。這個類封裝了像水平和豎直方向的Size Class等信息。iOS8的UIKit中大多數UI的基礎類(包括UIScreen,UIWindow,UIViewController和UIView)都實現了UITraitEnvironment
這個接口,經過其中的traitCollection
這個屬性,咱們能夠拿到對應的UITraitCollection
對象,從而得知當前的Size Class,並進一步肯定界面的佈局。和UIKit中的響應者鏈正好相反,traitCollection
將會在view hierarchy
中自上而下地進行傳遞。對於沒有指定traitCollection
的UI部件,將使用其父節點的traitCollection
。這在佈局包含childViewController
的界面的時候會至關有用。在UITraitEnvironment
這個接口中另外一個很是有用的是-traitCollectionDidChange:
。在traitCollection
發生變化時,這個方法將被調用。在實際操做時,咱們每每會在ViewController
中重寫-traitCollectionDidChange:
或者-willTransitionToTraitCollection:withTransitionCoordinator:
方法(對於ViewController
來講的話,後者也許是更好的選擇,由於提供了轉場上下文方便進行動畫;可是對於普通的View來講就只有前面一個方法了),而後在其中對當前的traitCollection
進行判斷,並進行從新佈局以及動畫。代碼看起來大概會是這個樣子:ui
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
- (void)willTransitionToTraitCollection:(UITraitCollection *)newCollection withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinator { [super willTransitionToTraitCollection:newCollection withTransitionCoordinator:coordinator]; [coordinator animateAlongsideTransition:^(id <UIViewControllerTransitionCoordinatorContext> context) { if (newCollection.verticalSizeClass == UIUserInterfaceSizeClassCompact) { //To Do: modify something for compact vertical size } else { //To Do: modify something for other vertical size } [self.view setNeedsLayout]; } completion:nil]; } |
在兩個To Do處,咱們要手寫代碼針對不一樣的狀態作調整。spa
Xcode6中Interface Builder
對Size Class
有了很強大的支持,xib中能夠開啓Size Classes以下圖:設計
在不一樣的Size Classes
描述下,界面元素能夠選擇安裝仍是不安裝,具體操做如圖:3d
Xcode6中Image Asset
也支持了Size Class
,也就是說,咱們能夠對不一樣的Size Class
指定不一樣的圖片了。在Image Asset
的編輯面板中選擇某張圖片,Inspector裏如今多了一個Width
和Height
的組合,添加咱們須要對應的Size Class
,而後把合適的圖拖上去,這樣在運行時SDK
就將從中挑選對應的Size
的圖進行替換了。支持Size Class
的Image Asset
編輯效果以下:code