開始用Swift開發(fā)iOS 10 - 3 介紹Auto Layout

Auto layout是一種基于約束的,描述性的布局系統(tǒng)。

iPhone尺寸

為什么使用Auto Layout

前面的一部分的項(xiàng)目HelloWorld默認(rèn)是運(yùn)行的iPhone 7(iPhone 6)的豎屏下的扭勉,button是在屏幕中間的,但是如果其他屏幕大小或不同方位就不一定了栓票。按照在默認(rèn)iPhone 7的條件下毅厚,button的左上角的坐標(biāo)是(147,318),其他尺寸的設(shè)備和不同方位顯示時(shí)也會(huì)按照這種坐標(biāo)顯示过咬,就不會(huì)在中間了大渤,這也就是為什么需要使用Auto Layout

Auto Layout就是關(guān)于所有約束

關(guān)于“Hello World”按鈕的位置信息的描述可能比較好的是:

無論屏幕的分辨率和方位掸绞,這個(gè)按鈕在水平和垂直方向都應(yīng)該是居中的

這實(shí)際就定義了兩個(gè)約束:

  • 水平居中
  • 垂直居中

在Auto Layout中約束都被描述成數(shù)學(xué)表示泵三,例如上述兩個(gè)限制就會(huì)被表示成: Hello World.centerX = centerX 袁勺, Hello World.centerY = centerY户辱。當(dāng)然我們不需要直接處理這種數(shù)學(xué)公式婴渡,Xcode會(huì)幫我們處理澡腾。

使用Auto Layout使Button到中央

Xcode提供了兩種方法定義Auto Layout的約束:

  1. Auto Layout工具欄
  2. Control-drag

Auto Layout工具欄提供了四個(gè)按鈕:

  • Stack - 組合views變成一個(gè)stack view
  • Align - 構(gòu)建對(duì)齊約束
  • Pin - 構(gòu)建空間約束,例如UI的寬度较曼,高度凌埂,邊距等
  • Issues - 解決布局問題

使用Align來定義兩個(gè)約束:水平居中垂直居中。彈窗中"Horizontal in container"后的數(shù)字表示button中心點(diǎn)的x坐標(biāo)與父視圖中心點(diǎn)的x坐標(biāo)的相差數(shù)诗芜, "Vertically in container"后的數(shù)字表示button中心點(diǎn)的y坐標(biāo)與父視圖中心點(diǎn)的y坐標(biāo)的相差數(shù)。如果都為零就表示button的中心和父視圖的中心是相同的埃疫,也就是說button水平和垂直方向都居中伏恐。

點(diǎn)擊 "Add 2 Constraints" 后,會(huì)出現(xiàn)如下情況栓霜。在document outline中出現(xiàn)兩個(gè)約束選項(xiàng)翠桦,在視圖中出現(xiàn)垂直兩條藍(lán)色的實(shí)線,在size檢查器中也能看到約束胳蛮。

如果點(diǎn)擊每個(gè)約束销凑,在size檢查器中還能看到每個(gè)約束的具體信息,也能在此修改約束仅炊。


解決布局約束問題

Xcode可以非常智能的檢測(cè)的布局約束方面的問題斗幼。當(dāng)創(chuàng)建了模棱兩可或沖突的約束時(shí)就會(huì)出現(xiàn)布局問題。試著將button拖動(dòng)左下角抚垄,視圖中原本的藍(lán)色實(shí)線變成了黃色實(shí)線蜕窿,并且線上還有數(shù)字,這些數(shù)字表示button現(xiàn)在的位置偏離約束的距離呆馁,document outline右上角出現(xiàn)一個(gè)黃色箭頭(disclosure arrow)桐经。

點(diǎn)擊disclosure arrow,出現(xiàn)布局問題列表浙滤,紅色框中的Expected表示現(xiàn)在約束所期望的位置也就是居中位置阴挣,Actual表示現(xiàn)在實(shí)際位置。每個(gè)問題右側(cè)有個(gè)indicator icon纺腊,點(diǎn)擊它出現(xiàn)一個(gè)彈框畔咧,選擇Update Frame然后點(diǎn)擊Fix Misplacement,按鈕回到原來中央位置摹菠;選擇Update constraints表示button的位置不變盒卸,更新到最新位置的約束。

實(shí)際上次氨,點(diǎn)擊Auto Layout工具欄最右側(cè)的issue蔽介,也會(huì)出現(xiàn)類似的功能:

不同設(shè)備同時(shí)預(yù)覽

Xcode提供了一個(gè)同時(shí)預(yù)覽不同設(shè)備下視圖的界面。按住option,然后按menu > Preview(1) > Main.storyboard (Preview)虹蓄,就能打開用于預(yù)覽的assistant editor犀呼。

這個(gè)預(yù)覽窗口可以預(yù)覽目前所有iOS設(shè)備。

添加一個(gè)Label

  1. 添加一個(gè)"Welcome to Auto Layout"的標(biāo)簽在右下角薇组,并打開預(yù)覽窗口查看外臂,發(fā)現(xiàn)出來除了默認(rèn)的iPhone 7,其他設(shè)備要不偏離了律胀,要不不見了宋光。


  2. control+drag方法來添加spacing constraint。按住control炭菌,從label上向右拖動(dòng)罪佳,拖出label到視圖后松開,出現(xiàn)彈框黑低,選擇 "Trailing space to container margin" 赘艳,表示設(shè)置右邊距的約束。

  3. 類似2的方法克握,向下拖動(dòng)松開蕾管,選擇彈框中的"Vertical Spacing to Bottom Layout Guide",表示設(shè)置了下邊距約束菩暗。所有約束線變成了藍(lán)色實(shí)線掰曾,藍(lán)色實(shí)線表示約束正常。 document outline上又出現(xiàn)兩個(gè)約束:

此時(shí)如果用預(yù)覽窗口查看停团,發(fā)現(xiàn)label在不同的設(shè)備上都在右下角了:


編輯約束

前面也提到約束本身可以手動(dòng)修改的婴梧,選擇約束,然后在size檢查器中修改客蹋。默認(rèn)label的"trailingMargin"約束的constant值是0塞蹭,可以試著修改。

練習(xí)

  • 添加新的label讶坯,修改文本為Learn Swift
  • 把字體大小改為30 point番电,調(diào)整label為適宜大小
  • 添加兩個(gè)約束
    • label的上邊距為40point
    • label水平居中

代碼

HelloWorldAutoLayout
HelloWorldAutoLayoutExercise

說明

此文是學(xué)習(xí)appcode網(wǎng)站出的一本書 《Beginning iOS 10 Programming with Swift》 的一篇記錄

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市辆琅,隨后出現(xiàn)的幾起案子漱办,更是在濱河造成了極大的恐慌,老刑警劉巖婉烟,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娩井,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡似袁,警方通過查閱死者的電腦和手機(jī)洞辣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門咐刨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人扬霜,你說我怎么就攤上這事定鸟。” “怎么了著瓶?”我有些...
    開封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵联予,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我材原,道長(zhǎng)沸久,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任余蟹,我火速辦了婚禮麦向,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘客叉。我一直安慰自己,他們只是感情好话告,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開白布兼搏。 她就那樣靜靜地躺著,像睡著了一般沙郭。 火紅的嫁衣襯著肌膚如雪佛呻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天病线,我揣著相機(jī)與錄音吓著,去河邊找鬼。 笑死送挑,一個(gè)胖子當(dāng)著我的面吹牛绑莺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播惕耕,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼纺裁,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了司澎?” 一聲冷哼從身側(cè)響起欺缘,我...
    開封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎挤安,沒想到半個(gè)月后谚殊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蛤铜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年嫩絮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了丛肢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡絮记,死狀恐怖摔踱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情怨愤,我是刑警寧澤派敷,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站撰洗,受9級(jí)特大地震影響篮愉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜差导,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一试躏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧设褐,春花似錦颠蕴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至外冀,卻和暖如春寡键,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背雪隧。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工西轩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人脑沿。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓藕畔,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親庄拇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子劫流,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

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