iOS8 Size Classes的理解與使用

Size Classes是什麼

iOS 8在應用界面的可視化設計上添加了一個新的特性-Size Classes,對於任何設備來講,界面的寬度和高度都只分爲兩種描述:正常緊湊。這樣開發者即可以無視設備具體的尺寸,而是對這兩類和它們的組合進行適配。這樣不論在設計時仍是代碼上,咱們均可以再也不受限於具體的尺寸,而是變成遵循尺寸的視覺感官來進行適配。在Xcode中的具體體現以下圖:ide

Alt text

可是咱們看到圖中的寬度和高度都是Any,Any是什麼意思呢?若是weight設爲Anyheight設置爲Regular,那麼在該狀態下的界面元素在只要heightRegular,不管weightRegular仍是Compact的狀態中都會存在。這種關係應該叫作繼承關係,具體的四種界面描述與可繼承的界面描述以下:佈局

  • w:Compact h:Compact 繼承 (w:Any h:Compact , w:Compact h:Any , w:Any h:Any)
  • w:Regular h:Compact 繼承 (w:Any h:Compact , w:Regular h:Any , w:Any h:Any)
  • w:Compact h:Regular 繼承 (w:Any h:Regular , w:Compact h:Any , w:Any h:Any)
  • w:Regular h:Regular 繼承 (w:Any h:Regular , w:Regular h:Any , w:Any h:Any)

咱們知道了iOS 8下面設備界面能夠描述爲4種,可是這麼多設備(iPhone4S,iPhone5/5s,iPhone6,iPhone6 Plus,iPad,Apple Watch)具體對應什麼描述呢?通過查看官方文檔和具體實踐得知具體對應關係以下:動畫

  • iPhone4S,iPhone5/5s,iPhone6
    • 豎屏:(w:Compact h:Regular)
    • 橫屏:(w:Compact h:Compact)
  • iPhone6 Plus
    • 豎屏:(w:Compact h:Regular)
    • 橫屏:(w:Regular h:Compact)
  • iPad
    • 豎屏:(w:Regular h:Regular)
    • 橫屏:(w:Regular h:Regular)
  • Apple Watch(猜想)
    • 豎屏:(w:Compact h:Compact)
    • 橫屏:(w:Compact h:Compact)

Size Classes手寫代碼

爲了表徵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

Size Classes與Interface Builder

Xcode6中Interface BuilderSize Class有了很強大的支持,xib中能夠開啓Size Classes以下圖:設計

Alt text

在不一樣的Size Classes描述下,界面元素能夠選擇安裝仍是不安裝,具體操做如圖:3d

Alt text

Size Classes與Image Asset

Xcode6中Image Asset也支持了Size Class,也就是說,咱們能夠對不一樣的Size Class指定不一樣的圖片了。在Image Asset的編輯面板中選擇某張圖片,Inspector裏如今多了一個WidthHeight的組合,添加咱們須要對應的Size Class,而後把合適的圖拖上去,這樣在運行時SDK就將從中挑選對應的Size的圖進行替換了。支持Size ClassImage Asset編輯效果以下:code

Alt text

相關文章
相關標籤/搜索