在螢幕越來越多的蘋果圈裡,就算單單是做手機應用,在螢幕尺寸的判斷上也不再是一個if就能解決的問題。在iOS8上apple新出了sizeClass這一功能配合以前的Autolayout使用,完美的解決了螢幕適配的問題。
SizeClass將螢幕的寬度和高度都抽象為三種情況:緊湊 (Compact) 、任意 (Any) 、 正常 (Regular),兩兩組合下,一共有9種類別,所以SizeClass看起來就像一個可以隨意切換畫面的九宮格,在設定 Size Class 的時候頁面會提示當前介面適配哪種螢幕。這樣把各種尺寸的介面放在一個Storyboard中,我們在為各種螢幕做適配工作的時候就可以在一個檔案中完成,然後根據不同裝置螢幕大小的不同進行調整。
建立一個項目,裝置選擇Universal,預設的都是啟用了SizeClass 和Autolayout ,Storyboard的預設尺寸寬高均為 Any:
在(w:Any | h: Any)下添加一個按鈕到Storyboard上:
SizeClass的作用是將不同尺寸的螢幕抽象出來進行分類處理,後面進行布局管理的還是Autolayout,接下來開始向按鈕添加約束,點擊右鍵選中按鈕,向上拖(control鍵+左鍵向上拖也可以達到這個效果),選擇“Top Space to Top Layout Guide”約束按鈕距離螢幕頂部的距離,確定按鈕的Y
添加第一個約束後,左邊視圖出現一個紅色剪頭提示:
點進去,系統提示X也需要約束
右鍵選中按鈕向左拖動(或者control鍵+左鍵向左拖)選擇"Leading Space to Container Margin”,確定按鈕的X:
這時左上方的紅色錯誤已經消失,剩下一個警告,提示預期的按鈕大小和實際按鈕大小不一致:
右鍵選中按鈕,拖動到自己會出現下圖,選擇width和height固定按鈕的寬高:
或者點擊下方的按鈕,將width和height都勾上,然後點擊 add 2 constraints:
這樣下來對這個按鈕的約束就完成了,左上方的警告也消除,點擊按鈕,可以在右邊看到按鈕上的約束並修改約束值:
隨意選中一個約束,可以在右邊去掉Installed前面的√,點擊加號從sizeClass的9中介面類型中選擇在哪種類型的介面隱藏或顯示此約束:
剛剛都是在單獨的講解SizeClass和AutoLayout,現在將它們聯合起來進行螢幕適配,開啟九宮格,選擇iPhone屏(w:Compact | h:Any):
在上面放幾個label:
接下來將螢幕切換到iPad(w:Regular | h:Regular),可以看到在iPad介面工作時,iPhone介面下拖的label是灰色的,表示不可用。
接下來就讓程式在iphong和iPad上分別跑起來:
如果有童鞋建立的項目只選擇了iPhone的話,那麼不論你在iPad屏上怎麼設定模擬器上顯示出來的都是在iPhone上設計的樣式(血淚教訓,當時還認為自己環境有問題)依照這個功能,我們就能在iPhone和iPad上充分利用螢幕的特性設計UI了。
想要刪除某個螢幕上的約束用 command+delete鍵刪除,這樣就只是在iPhone屏上刪除掉此約束,顯示為灰色,表示不可用其他尺寸不受影響。
選擇iphone屏,在上面建立一個按鈕:
右鍵選中黃色按鈕拖動到紅色按鈕,選擇Horizontal Spacing(設定黃色按鈕到紅色按鈕的橫向間距)確定X:
點開左邊的錯誤,提示Y也需要約束:
右鍵向上拖動按鈕,選擇“Top Space to Top Layout Guide”,確定Y:
現在又剩下一個警告,提示預期的按鈕大小和實際按鈕大小不一致,這次我們把黃色按鈕的大小約束設定到紅色按鈕上去,讓它們一樣大小:
右鍵拖動到紅色按鈕,選擇寬,高相等:
點開左邊的警告,選擇update frame,更新架構:
更新後的介面應該是這個樣子的:
和想象中有點不一樣,黃色按鈕低了一點,在右邊修改黃色按鈕到頂部的長度和紅色按鈕一樣:
這下就沒問題了:
大小除了寬高相等之外,還可以在設定中按比例設定兩個按鈕的寬高(可自訂輸入比例):
對於有特殊需求的還可以選擇”Aspect Ration“設定兩個按鈕寬和高的比例進行大小設定:
當然,如果要進行寬高比例進行大小約束,前面設定的大小約束就要刪除掉,不然會造成約束衝突,總之,約束就是為了確定一個控制項在螢幕上的唯一位置,確定X,Y,然後賦大小。
因為自己也是學了之後沒有進行項目就寫的這篇部落格,可能大家看著會感覺很混亂,沒水平,有錯誤,但也是自己對這個知識點的一個理解了,希望能讓大家有所收穫,提出錯誤和不足之處。