編輯導(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。
它的中文翻譯「調(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í)的橫向和縱向。
左側(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è)的下拉框去選擇劇本就行。
三、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)容~)
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í)變化。
因?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)。
其實(shí),這是因?yàn)槲淖謭D層本身也有類似Resizing的屬性,所以允許文字型子級(jí)有Hug contents功能。
文字的Resizing,也就是我們熟知的文本框三屬性:自動(dòng)寬度,自動(dòng)高度和固定尺寸。
而這三個(gè)屬性,和自動(dòng)布局中的Resizing異曲同工,之間也存在著一對(duì)一或者一對(duì)多的對(duì)應(yīng)關(guā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)變化。
先說(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)有的。
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那樣跟隨變化。
然后,我們?cè)俟潭ㄆ涓叨龋╢ix height)。改變父級(jí)或子級(jí)的尺寸,子級(jí)高度同樣未跟隨變化。
子級(jí)搞完,我們?cè)賮?lái)嘗試下父級(jí)。
我們又回到最初的起點(diǎn),將子級(jí)設(shè)定Hug contents,父級(jí)固定其寬高。那么增加文字后,可以發(fā)現(xiàn)不論子級(jí)怎么變化,父級(jí)自身的寬高都維持不變。
四、實(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)該是下面這樣:
首先,從目標(biāo)回推,要想實(shí)現(xiàn)這樣的效果,也就是讓內(nèi)部的子級(jí)跟隨這一整個(gè)卡片父級(jí)。所以我們選擇兒子聽(tīng)父親的劇本-Fill container,將其應(yīng)用到我們的子級(jí)-上下兩個(gè)嵌套的自動(dòng)布局frame。
應(yīng)用后,作者單元的尺寸因?yàn)橐S父級(jí),所以進(jìn)行了拉伸。
但是!我們改變卡片尺寸時(shí)并沒(méi)有任何反應(yīng)。
這是因?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)成。
這些便是可以應(yīng)用劇本的對(duì)象。當(dāng)然,劇本需要根據(jù)場(chǎng)景來(lái)選擇。我希望頭像保持固定,所以安排fix size固定其寬高。而其他的對(duì)象,我希望能全部跟隨父級(jí)變化,所以統(tǒng)一安排Fill container。
最后,表演一下,完美。
五、最后
咱們一起盤下本篇的知識(shí)點(diǎn)——
- 自動(dòng)布局的Resizing幫助你實(shí)現(xiàn)父子級(jí)動(dòng)態(tài)關(guān)系,它有三個(gè)劇本:Hug contents、Fill container和Fixed size;
- Hug contents:父級(jí)跟隨子級(jí)。它是自動(dòng)布局的默認(rèn)劇本;
- Fill container:子級(jí)跟隨父級(jí)。這個(gè)功能可實(shí)現(xiàn)動(dòng)態(tài)響應(yīng)布局;
- Fixed size:誰(shuí)也不跟誰(shuí)。常用于需固定尺寸的對(duì)象(比如頭像)
- 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é)議。
很詳細(xì),感謝
透
就像文章標(biāo)題說(shuō)的,手把手教你如何進(jìn)行自動(dòng)布局設(shè)計(jì),知識(shí)點(diǎn)滿滿。
非常好