手把手教你自動(dòng)布局的進(jìn)階玩法,看這一篇就夠了(超干干貨)

4 評(píng)論 5946 瀏覽 19 收藏 15 分鐘

編輯導(dǎo)語(yǔ):自動(dòng)布局在任何一個(gè)應(yīng)用中都是關(guān)鍵,可以達(dá)到事半功倍的效果。本篇文章帶你深入了解自動(dòng)布局,幫你掌握自動(dòng)布局的進(jìn)階玩法,一起來(lái)看看吧!

自動(dòng)布局的初步玩法更多的聚焦在基礎(chǔ)和外在,真正的進(jìn)階玩法我留到了這篇。

理解成本較高,所以我使用了一些講故事的方法,希望讓你更輕松得學(xué)習(xí)和掌握。

一、自動(dòng)布局的本質(zhì)(core)

自動(dòng)布局的本質(zhì),在于父子級(jí)動(dòng)態(tài)關(guān)系的把控。

大猩猩在SD12集和櫻木說(shuō)過(guò):能夠掌控籃板球,就能掌控比賽。(對(duì),我又祭出這張圖了)

我認(rèn)為,能掌控父子級(jí)動(dòng)態(tài)關(guān)系,就能掌控自動(dòng)布局。

而在自動(dòng)布局中,能具體去實(shí)現(xiàn)這種動(dòng)態(tài)關(guān)系的是Resizing功能。

看到這里你可能會(huì)很懵逼,啥是父子級(jí)動(dòng)態(tài)關(guān)系?啥是Resizing?別急,下面都會(huì)講。

二、Rezising是啥(what)

如果你創(chuàng)建了一個(gè)自動(dòng)布局,那么你會(huì)發(fā)現(xiàn),在auto layout面板下面,會(huì)多出這么一個(gè)玩意兒,它就是Resizing。

手把手教你自動(dòng)布局的進(jìn)階玩法,看這一篇就夠了→(超干干貨)

它的中文翻譯「調(diào)整大小」讓人一言難盡,文不表意還容易誤導(dǎo),所以我只叫它英文。

先看下官方對(duì)它的描述:當(dāng)一個(gè)對(duì)象的父級(jí)或者子級(jí)發(fā)生尺寸改變時(shí),你可以通過(guò)Resizing來(lái)控制其如何跟隨適應(yīng)。

可能會(huì)有些晦澀難懂,所以我打了個(gè)比方:

現(xiàn)在,《導(dǎo)演請(qǐng)指教》欄目組發(fā)現(xiàn)了你無(wú)與倫比的導(dǎo)演才華,邀你去節(jié)目組競(jìng)(chao)演(zuo),而此次的電影主題是「父子情」。

現(xiàn)在你的麾下有Resizing這么一個(gè)編劇,他寫好了三個(gè)和父子情相關(guān)的劇本。

而你要做的,就是發(fā)揮你的絕妙才智確定一個(gè)合適的劇本,來(lái)在不同的場(chǎng)景下確定父親和兒子關(guān)系的走向,以此干翻你的對(duì)手。

這里父親和兒子關(guān)系的走向,就是我上面所說(shuō)的父子級(jí)動(dòng)態(tài)關(guān)系。

而這三個(gè)劇本,分別叫Hug contents、Fill container和Fixed size。你可以在Resizing右側(cè)的兩個(gè)下拉框里發(fā)現(xiàn)它們。這兩個(gè)下拉框,分別代表了子級(jí)或者父級(jí)的橫向和縱向。

手把手教你自動(dòng)布局的進(jìn)階玩法,看這一篇就夠了→(超干干貨)

左側(cè)的圖標(biāo)又是啥?

這里引用下草帽老師的觀點(diǎn),Resizing容易給你整懵的很大一部分原因,在于左側(cè)的圖標(biāo)??瓷先セH?,但其實(shí),左側(cè)圖標(biāo)和右側(cè)下拉框?qū)崿F(xiàn)的是一個(gè)功能。

因?yàn)閳D標(biāo)非常難用,我的建議是,只通過(guò)右側(cè)的下拉框去選擇劇本就行。

手把手教你自動(dòng)布局的進(jìn)階玩法,看這一篇就夠了→(超干干貨)

三、Rezising的三個(gè)劇本(juben)

下面,我為你簡(jiǎn)單講下這三個(gè)劇本。懂這三個(gè)劇本,你的自動(dòng)布局基本就不成問(wèn)題。(注意,下面涉及到父子級(jí)關(guān)系,如果對(duì)這些概念不了解的小伙伴,強(qiáng)烈建議看完【6000字超干干貨】沒(méi)搞定這個(gè)概念,figma就真的白用了!→中的對(duì)象關(guān)系、frame多合一優(yōu)勢(shì)這兩節(jié)內(nèi)容~)

手把手教你自動(dòng)布局的進(jìn)階玩法,看這一篇就夠了→(超干干貨)

1. Hug contents

Hug contents(適應(yīng)內(nèi)容)這個(gè)劇本,主線就是「父親聽(tīng)兒子的」——即父級(jí)的尺寸跟隨子級(jí)的尺寸而變化。這個(gè)劇本的主角是父親

舉個(gè)例子,下面這個(gè)按鈕就是父級(jí),按鈕內(nèi)部的文字就是子級(jí)。

我們將主角(父級(jí))的Resizing設(shè)定成Hug contents,接下來(lái)的劇情就按這個(gè)劇本走——不論子級(jí)什么長(zhǎng)度,按鈕這個(gè)父級(jí)的尺寸始終跟隨子級(jí)變化。

手把手教你自動(dòng)布局的進(jìn)階玩法,看這一篇就夠了→(超干干貨)

因?yàn)檫@種劇本的使用場(chǎng)景最多,所以它也是所有自動(dòng)布局默認(rèn)的劇本。

先說(shuō)結(jié)論:所有的父級(jí)和文字子級(jí)。(以下分析過(guò)程有些繞,可直接跳過(guò),不影響Resizing的掌握)

Hug contents是父級(jí)跟隨子級(jí),所以我們選定的這個(gè)對(duì)象,必須得有子級(jí)讓我們?nèi)ジ?/strong>這就好比主角想聽(tīng)兒子的話,前提是他得有一個(gè)兒子才行。

所以,按鈕文字作為唯一的、沒(méi)有兒子的子級(jí),選定它時(shí)理應(yīng)不該出現(xiàn)Hug contents這個(gè)劇本。

但讓我頗為意外的是,它作為子級(jí)時(shí)偏偏就有這選項(xiàng)。而我們把文字替換成其他圖層(比如形狀)時(shí)卻沒(méi)有出現(xiàn)。

手把手教你自動(dòng)布局的進(jìn)階玩法,看這一篇就夠了→(超干干貨)

其實(shí),這是因?yàn)槲淖謭D層本身也有類似Resizing的屬性,所以允許文字型子級(jí)有Hug contents功能。

文字的Resizing,也就是我們熟知的文本框三屬性:自動(dòng)寬度,自動(dòng)高度和固定尺寸。

手把手教你自動(dòng)布局的進(jìn)階玩法,看這一篇就夠了→(超干干貨)

而這三個(gè)屬性,和自動(dòng)布局中的Resizing異曲同工,之間也存在著一對(duì)一或者一對(duì)多的對(duì)應(yīng)關(guān)系。

手把手教你自動(dòng)布局的進(jìn)階玩法,看這一篇就夠了→(超干干貨)

比如你將其屬性定義為自動(dòng)寬度,那么你會(huì)發(fā)現(xiàn)橫、縱向的劇本都是用了Hug contents,但如果你把橫向改成了Fixed width,你會(huì)發(fā)現(xiàn)文本框?qū)傩宰兂闪俗詣?dòng)高度。

而這種橫向定寬、縱向自適應(yīng)的特點(diǎn),則正好對(duì)應(yīng)了這種屬性。

2. Fill container

Fill container(填充容器)這個(gè)劇本和上面的完全相反,它的別稱是《你爹還是你爹》,主線是「兒子聽(tīng)父親的」,即子級(jí)尺寸跟隨父級(jí)的變化而變化。它的主角是兒子。

繼續(xù)用這個(gè)按鈕案例,我們?cè)谧詣?dòng)布局時(shí)已事先設(shè)定了上下8px、左右24px的padding值(內(nèi)間距)。

然后橫向上,將子級(jí)設(shè)定Fill container。然后改變父級(jí)的寬度,你會(huì)發(fā)現(xiàn),不論父級(jí)什么尺寸,子級(jí)寬度將始終基于所設(shè)定的padding值,跟隨響應(yīng)變化。

手把手教你自動(dòng)布局的進(jìn)階玩法,看這一篇就夠了→(超干干貨)

先說(shuō)結(jié)論:作為主角的子級(jí)。所謂的子級(jí),就是有父級(jí)(frame、group等)包裹的對(duì)象,因?yàn)橹挥羞@樣才能讓子級(jí)跟隨。

所以我們選定的對(duì)象,如果沒(méi)被父級(jí)包裹時(shí)(比如直接放在畫布上的top frame畫板),F(xiàn)ill container劇本是沒(méi)有的。

手把手教你自動(dòng)布局的進(jìn)階玩法,看這一篇就夠了→(超干干貨)

3. Fixed size

上面?zhèn)z劇本,總得有一方必須聽(tīng)另一方的。

Resizing大佬覺(jué)得人物關(guān)系不夠?qū)α?,不夠吸引眼球,因此又?chuàng)作了第三個(gè)劇本Fixed size,主線就是「兒子和老子反目成仇,誰(shuí)也不服誰(shuí)」。

我們固定元素的橫向或縱向尺寸后,其尺寸都不會(huì)跟隨父級(jí)或者子級(jí)的變化而變化。表面上還像以前那么親密,但早已貌合神離、形同陌路。

比如這個(gè)按鈕,我們固定子級(jí)的寬度(fix width),在改變父級(jí)(按鈕容器)或者子級(jí)的寬度后,子級(jí)寬度將始終保持固定,并沒(méi)有像fill container那樣跟隨變化。

手把手教你自動(dòng)布局的進(jìn)階玩法,看這一篇就夠了→(超干干貨)

然后,我們?cè)俟潭ㄆ涓叨龋╢ix height)。改變父級(jí)或子級(jí)的尺寸,子級(jí)高度同樣未跟隨變化。

手把手教你自動(dòng)布局的進(jìn)階玩法,看這一篇就夠了→(超干干貨)

子級(jí)搞完,我們?cè)賮?lái)嘗試下父級(jí)。

我們又回到最初的起點(diǎn),將子級(jí)設(shè)定Hug contents,父級(jí)固定其寬高。那么增加文字后,可以發(fā)現(xiàn)不論子級(jí)怎么變化,父級(jí)自身的寬高都維持不變。

手把手教你自動(dòng)布局的進(jìn)階玩法,看這一篇就夠了→(超干干貨)

四、實(shí)戰(zhàn)(fight)

這里繼續(xù)沿用咱們上篇文章所制作的自動(dòng)布局化的卡片。

我們的目標(biāo)是:通過(guò)Resizing這個(gè)功能來(lái)實(shí)現(xiàn)這個(gè)卡片的動(dòng)態(tài)響應(yīng)。最后的效果應(yīng)該是下面這樣:

手把手教你自動(dòng)布局的進(jìn)階玩法,看這一篇就夠了→(超干干貨)

首先,從目標(biāo)回推,要想實(shí)現(xiàn)這樣的效果,也就是讓內(nèi)部的子級(jí)跟隨這一整個(gè)卡片父級(jí)。所以我們選擇兒子聽(tīng)父親的劇本-Fill container,將其應(yīng)用到我們的子級(jí)-上下兩個(gè)嵌套的自動(dòng)布局frame。

手把手教你自動(dòng)布局的進(jìn)階玩法,看這一篇就夠了→(超干干貨)

應(yīng)用后,作者單元的尺寸因?yàn)橐S父級(jí),所以進(jìn)行了拉伸。

手把手教你自動(dòng)布局的進(jìn)階玩法,看這一篇就夠了→(超干干貨)

但是!我們改變卡片尺寸時(shí)并沒(méi)有任何反應(yīng)。

手把手教你自動(dòng)布局的進(jìn)階玩法,看這一篇就夠了→(超干干貨)

這是因?yàn)椋篎ill container只能決定子級(jí)跟隨當(dāng)前層的父級(jí)。如果存在多個(gè)嵌套層,那么每一層的子級(jí)都得去應(yīng)用這個(gè)劇本,彼此聯(lián)動(dòng)才能生效。

比如這個(gè)卡片,我們只把劇本應(yīng)用到一級(jí)拆分下的倆frame,那么子級(jí)跟隨父級(jí)變化的規(guī)則僅在這一層生效。但更細(xì)分下的子級(jí)并沒(méi)有生效,那么整體卡片就無(wú)法正常響應(yīng)。

這就好像表盤里的那些齒輪,任意一個(gè)齒輪的齒口沒(méi)有銜接上,那么整個(gè)鐘表就無(wú)法運(yùn)行。

因此,我們需要把劇本應(yīng)用到所有內(nèi)嵌的子級(jí),才能使整個(gè)卡片動(dòng)態(tài)響應(yīng)。

這里我用一張圖來(lái)示意這個(gè)拆解的過(guò)程。我們從最外層的卡片(top frame)往內(nèi)拆,直到拆到不能拆為止。可與看到,每一層的對(duì)象都是由嵌套frame(nested frame)和唯一子級(jí)(chidlren)構(gòu)成。

手把手教你自動(dòng)布局的進(jìn)階玩法,看這一篇就夠了→(超干干貨)

這些便是可以應(yīng)用劇本的對(duì)象。當(dāng)然,劇本需要根據(jù)場(chǎng)景來(lái)選擇。我希望頭像保持固定,所以安排fix size固定其寬高。而其他的對(duì)象,我希望能全部跟隨父級(jí)變化,所以統(tǒng)一安排Fill container。

手把手教你自動(dòng)布局的進(jìn)階玩法,看這一篇就夠了→(超干干貨)

最后,表演一下,完美。

手把手教你自動(dòng)布局的進(jìn)階玩法,看這一篇就夠了→(超干干貨)

五、最后

咱們一起盤下本篇的知識(shí)點(diǎn)——

  1. 自動(dòng)布局的Resizing幫助你實(shí)現(xiàn)父子級(jí)動(dòng)態(tài)關(guān)系,它有三個(gè)劇本:Hug contents、Fill container和Fixed size;
  2. Hug contents:父級(jí)跟隨子級(jí)。它是自動(dòng)布局的默認(rèn)劇本;
  3. Fill container:子級(jí)跟隨父級(jí)。這個(gè)功能可實(shí)現(xiàn)動(dòng)態(tài)響應(yīng)布局;
  4. Fixed size:誰(shuí)也不跟誰(shuí)。常用于需固定尺寸的對(duì)象(比如頭像)
  5. Fill container只能決定子級(jí)跟隨當(dāng)前層的父級(jí),所以存在多層嵌套結(jié)構(gòu)時(shí),每一層都得考慮。

原創(chuàng)不易,如果這篇文章對(duì)你產(chǎn)生了些許幫助,歡迎點(diǎn)個(gè)「在看」,支持我原創(chuàng)的同時(shí)也讓它幫助到更多的小伙伴。

我是Andrew,一個(gè)將寫作當(dāng)成事業(yè)的設(shè)計(jì)師。

下期見(jiàn)。

 

作者:Andrew丞;公眾號(hào):Andrew的設(shè)計(jì)筆記

原文鏈接:https://mp.weixin.qq.com/s/Q_KCBPOhdOzoQ4p67qC9OQ

本文由 @Andrew的設(shè)計(jì)筆記 授權(quán)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載。

題圖來(lái)自Unsplash,基于CC0協(xié)議。

更多精彩內(nèi)容,請(qǐng)關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號(hào)或下載App
評(píng)論
評(píng)論請(qǐng)登錄
  1. 很詳細(xì),感謝

    來(lái)自河南 回復(fù)
  2. 回復(fù)
  3. 就像文章標(biāo)題說(shuō)的,手把手教你如何進(jìn)行自動(dòng)布局設(shè)計(jì),知識(shí)點(diǎn)滿滿。

    來(lái)自江蘇 回復(fù)
  4. 非常好

    來(lái)自河南 回復(fù)