參考資料:
Adaptive Layout Tutorial in iOS 9: Getting Started
iOS8 Size Classes初探 · sunnyxx的技術博客
Auto Layout 和 Constraints - iOS · 碎碎念 - SegmentFault
通過一個關于天氣的項目,你將學到通用故事板(Universal Storyboards),尺寸類別(Size Classes)泉手,自定義布局和字體运沦,預覽助手編輯器(Preview Assistant Editor)相關的知識。
項目效果圖:
01 通用故事板(Universal Storyboards)
1.什么是通用故事板?簡言之爽室,能為ipad和iPhone所用的故事板当娱。
2.為什么Main.Storyboard里的視圖控制器是正方形的?
將屏幕尺寸進行抽象化斧蜕,以適應不同屏幕尺寸的設備。
02 自定義布局
1.在Storyboard里砚偶,分別拖一個Image View和一個View出來批销,并在View的Identity Inspector里將”TextContainer“填入Label位置。
--進行Size設置染坯。
--進行Color設置均芽。
2.布局約束設置。
在storyboard中有三種方式設置約束
--ctrl+drag(可以從一個控件拖動到另一個控件单鹿,設置它們之間的關系掀宋。也可以拖動到控件自身,設置寬度和高度)(我個人偏好使用這種方式)
--使用Stack仲锄,Pin劲妙,Align,Resolve工具
好處一:使得精確控制約束的constant或一次性添加多個約束更方便儒喊;
好處二:不需設置好view的位置镣奋,而只需要定好相對位置,添加約束怀愧,然后update frames侨颈,Auto Layout會自動計算出正確的位置
--讓Interface Builder自動添加約束
前提是確定view的位置不再更改。
回到項目中:
(1)給image view加三個約束芯义。
--運用Align Tool肛搬,快速對齊控件。
--運用Pin Tool毕贼,給View定位温赔。快速設置一個View相對于周邊View的位置或者它的寬高鬼癣。
--Ctrl+drag設置image view和TextContainer之間的垂直間隔陶贼。
最后,三個constraints的添加完成待秃。
(2)給TextContainer加約束拜秧。
--使用Pin Tool。這里不需要勾選constrain to margins章郁。如果選中枉氮,會將父視圖的外邊距作為邊距的值來考慮志衍。margin的默認值是8,也就是說如果勾選聊替,三個框里應該填的是8.
(3)圖片填充image view:
(4)使用Resolve工具楼肪。
03 預覽助手編輯器
預覽助手編輯器能讓你更方便地查看view在不同尺寸設備,不同方向上的呈現(xiàn)情況惹悄。
1.選擇View-Assistant Editor-Show Assistant Editor-Automatic-Preview-Main.storyboard(Preview)
在左下角春叫,選擇+按鈕,在彈出的窗口中選擇iPhone 5.5inch和iPad泣港。
但是橫向時暂殖,cloud image顯得太大。
2.調整cloud image的大小当纱。選中image view呛每,ctrl+drag到view上,選擇Equal Heights坡氯。
解決這里constraints的沖突:選中新添加的constraint進行修改莉给,使得image view的高度等于view的高度或者小于等于view高度的40%
04?尺寸類別(Size Classes)
Size Classes簡介
1.Size Classes是什么?可以用來干什么?
它是對老式UI思路的全新抽象:把各個設備屏幕廉沮,以及它們屏幕旋轉的狀態(tài)都抽象成屏幕Size的變化,將這些Size歸納成幾個類別(Class)。
Size Class配合Auto Layout可以解決所有iOS設備屏幕尺寸及屏幕旋轉時候的UI適配問題 徐矩。
2.有幾種Size Classes滞时?有幾種Size Classes組合?
共有兩種Size Classes:Regular和Compact滤灯。下表顯示的是Size Class在不同裝置的不同方向上的運用情況:
有9種Size Classes組合坪稽。寬(Regular,Compact,Any),高(Regular,Compact,Any), 3 x 3,共9種組合。默認是在寬任意鳞骤,高任意模式下設置,且其他8種布局繼承它窒百。
3.Size Classes怎么用?
首先豫尽,搭建基本布局篙梢。接下來,再根據(jù)不同Size Class的具體需求進行自定義美旧。
IB中某個View的出現(xiàn)與否渤滞,約束的出現(xiàn)與否,約束的值都是可以根據(jù)Size Classes單獨設置的榴嗅。
比如妄呕,一個Image View,我只需要它出現(xiàn)在寬高緊縮(compact)的屏幕上(如Apple Watch)嗽测。Installed绪励,表示“出現(xiàn)在屏幕上”。
項目練習
1.往TextContainer里添加內容
--拖兩個Label出來,進行字體疏魏,顏色停做,約束的設置。
對于城市這個label蠢护,字體設置為System-Thin-150雅宾,顏色為白色。對于溫度這個Label葵硕,字體設置為System-Thin-250眉抬,顏色為白色。
但是懈凹,此時的字體顯然太大了蜀变。
2.切換Size Class為Any Width|Compact Height模式
3.更改image view的約束
(1)刪除image view默認類型的約束
--打開image view的Size Inspector,把Align Center X to:SuperView這個約束刪除介评。
雙擊這個約束進去库北。如圖,這表示對于基本布局们陆,約束是存在的寒瓦,但是對于Any Width|Compact Height模式的布局,約束是不存在的坪仇。對剩下三個約束做同樣的刪除操作杂腰。
(2)為Any Width|Compact Height模式的image view添加約束
然后,ctrl drag image view到View 上椅文,選擇Equal Widths喂很,Multiplier為0.45
接下來,需要把label移到右邊皆刺。
4.更改TextContainer的約束少辣。
(1)刪除默認模式下的約束。Cmd +delete TextContainer.leader = leading
(2)添加約束羡蛾。crtl drag TextContainer到View上漓帅。選擇Vertical Spacing to Top Layout Guide和Equal Widths(Multiplier設為0.5)
最后,update frames
05適配字體
注意:與overrride布局不同痴怨,override字體會影響到基本布局煎殷。
1.切換Size Class為Any Width|Any Height模式
2.打開城市l(wèi)abel的attributes inspector,點擊+號后腿箩,選擇Compact Width>Any Height豪直。并修改字體。
溫度label同樣做法珠移,只是Compact Width|Any Height的字體設置為150.
3.對兩個label的寬度加以限制弓乙。分別ctrl+drag label到TextContainer上末融,選擇Equal Widths。
4.對兩個label的Alignment和Autoshrink進行修改暇韧。
最后項目完成9聪啊!懈玻!
Github項目地址: