自適應(yīng)布局(Adaptive Layout)

參考資料:

Adaptive Layout Tutorial in iOS 9: Getting Started

iOS8 Size Classes初探 · sunnyxx的技術(shù)博客

Auto Layout 和 Constraints - iOS · 碎碎念 - SegmentFault

通過一個關(guān)于天氣的項(xiàng)目,你將學(xué)到通用故事板(Universal Storyboards),尺寸類別(Size Classes),自定義布局和字體,預(yù)覽助手編輯器(Preview Assistant Editor)相關(guān)的知識。

項(xiàng)目效果圖:

iPhone豎向
iPhone橫向


01 通用故事板(Universal Storyboards)

1.什么是通用故事板?簡言之,能為ipad和iPhone所用的故事板。

2.為什么Main.Storyboard里的視圖控制器是正方形的?

將屏幕尺寸進(jìn)行抽象化,以適應(yīng)不同屏幕尺寸的設(shè)備。

02 自定義布局

1.在Storyboard里,分別拖一個Image View和一個View出來,并在View的Identity Inspector里將”TextContainer“填入Label位置。

--進(jìn)行Size設(shè)置。

Image View的Size Inspector
Text Container的Size Inspector

--進(jìn)行Color設(shè)置。

View的背景顏色設(shè)置
TextContainer背景顏色設(shè)置

2.布局約束設(shè)置。

在storyboard中有三種方式設(shè)置約束

--ctrl+drag(可以從一個控件拖動到另一個控件,設(shè)置它們之間的關(guān)系。也可以拖動到控件自身,設(shè)置寬度和高度)(我個人偏好使用這種方式)

--使用Stack,Pin,Align,Resolve工具

好處一:使得精確控制約束的constant或一次性添加多個約束更方便;

好處二:不需設(shè)置好view的位置,而只需要定好相對位置,添加約束,然后update frames,Auto Layout會自動計(jì)算出正確的位置

--讓Interface Builder自動添加約束

前提是確定view的位置不再更改。

回到項(xiàng)目中:

(1)給image view加三個約束。

--運(yùn)用Align Tool,快速對齊控件。

Align Tool

--運(yùn)用Pin Tool,給View定位。快速設(shè)置一個View相對于周邊View的位置或者它的寬高。


Pin Tool

--Ctrl+drag設(shè)置image view和TextContainer之間的垂直間隔。

最后,三個constraints的添加完成。

image view的constraints

(2)給TextContainer加約束。

--使用Pin Tool。這里不需要勾選constrain to margins。如果選中,會將父視圖的外邊距作為邊距的值來考慮。margin的默認(rèn)值是8,也就是說如果勾選,三個框里應(yīng)該填的是8.

Pin Tool

(3)圖片填充image view:

cloud_images.zip

(4)使用Resolve工具。

Resolve Auto Layout Issues

03 預(yù)覽助手編輯器

預(yù)覽助手編輯器能讓你更方便地查看view在不同尺寸設(shè)備,不同方向上的呈現(xiàn)情況。

1.選擇View-Assistant Editor-Show Assistant Editor-Automatic-Preview-Main.storyboard(Preview)

在左下角,選擇+按鈕,在彈出的窗口中選擇iPhone 5.5inch和iPad。

Preview Assistant Editor

但是橫向時,cloud image顯得太大。

2.調(diào)整cloud image的大小。選中image view,ctrl+drag到view上,選擇Equal Heights。

解決這里constraints的沖突:選中新添加的constraint進(jìn)行修改,使得image view的高度等于view的高度或者小于等于view高度的40%

修改Constraint

04?尺寸類別(Size Classes)

Size Classes簡介

1.Size Classes是什么?可以用來干什么?

它是對老式UI思路的全新抽象:把各個設(shè)備屏幕,以及它們屏幕旋轉(zhuǎn)的狀態(tài)都抽象成屏幕Size的變化,將這些Size歸納成幾個類別(Class)。

Size Class配合Auto Layout可以解決所有iOS設(shè)備屏幕尺寸及屏幕旋轉(zhuǎn)時候的UI適配問題

2.有幾種Size Classes?有幾種Size Classes組合?

共有兩種Size Classes:Regular和Compact。下表顯示的是Size Class在不同裝置的不同方向上的運(yùn)用情況:

Size Class在不同裝置的不同方向上的運(yùn)用情況

有9種Size Classes組合。寬(Regular,Compact,Any),高(Regular,Compact,Any), 3 x 3,共9種組合。默認(rèn)是在寬任意,高任意模式下設(shè)置,且其他8種布局繼承它。

3.Size Classes怎么用?

首先,搭建基本布局。接下來,再根據(jù)不同Size Class的具體需求進(jìn)行自定義。

IB中某個View的出現(xiàn)與否,約束的出現(xiàn)與否,約束的值都是可以根據(jù)Size Classes單獨(dú)設(shè)置的。

比如,一個Image View,我只需要它出現(xiàn)在寬高緊縮(compact)的屏幕上(如Apple Watch)。Installed,表示“出現(xiàn)在屏幕上”。

項(xiàng)目練習(xí)

1.往TextContainer里添加內(nèi)容

--拖兩個Label出來,進(jìn)行字體,顏色,約束的設(shè)置。

對于城市這個label,字體設(shè)置為System-Thin-150,顏色為白色。對于溫度這個Label,字體設(shè)置為System-Thin-250,顏色為白色。

城市Label的約束
溫度Label的約束

但是,此時的字體顯然太大了。

Preview Assistant Editor

2.切換Size Class為Any Width|Compact Height模式

Any Width|Compact Height

3.更改image view的約束

(1)刪除image view默認(rèn)類型的約束

--打開image view的Size Inspector,把Align Center X to:SuperView這個約束刪除。

刪除約束

雙擊這個約束進(jìn)去。如圖,這表示對于基本布局,約束是存在的,但是對于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)刪除默認(rèn)模式下的約束。Cmd +delete TextContainer.leader = leading

(2)添加約束。crtl drag TextContainer到View上。選擇Vertical Spacing to Top Layout Guide和Equal Widths(Multiplier設(shè)為0.5)

添加約束

最后,update frames

Interface Builder

05適配字體

注意:與overrride布局不同,override字體會影響到基本布局。

1.切換Size Class為Any Width|Any Height模式

2.打開城市l(wèi)abel的attributes inspector,點(diǎn)擊+號后,選擇Compact Width>Any Height。并修改字體。

點(diǎn)擊+號
修改字體

溫度label同樣做法,只是Compact Width|Any Height的字體設(shè)置為150.

3.對兩個label的寬度加以限制。分別ctrl+drag label到TextContainer上,選擇Equal Widths。

4.對兩個label的Alignment和Autoshrink進(jìn)行修改。

對兩個label的Alignment和Autoshrink進(jìn)行修改

最后項(xiàng)目完成!!!

Github項(xiàng)目地址:

GitHub - Paganarchitect/iOS_tutorial_exercises_RayWenderlich: iOS exercises based on Ray Wenderlich tutorial

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,936評論 6 535
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,744評論 3 421
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,879評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,181評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,935評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,325評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,384評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,534評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,084評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,892評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,067評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,623評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,322評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,735評論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,990評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,800評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,084評論 2 375

推薦閱讀更多精彩內(nèi)容