iOS自動(dòng)布局1-基礎(chǔ)概念與原理

自動(dòng)布局出現(xiàn)以前的布局模式是基于UIView的frame屬性。

    UIView *subView = [[UIView alloc] initWithFrame:CGRectMake(100, 200, 50, 60)];
    [self.view addSubview:subView];

繪制效果如圖:

viewframe

從最底層的view開(kāi)始進(jìn)行布局供鸠,在它的上面對(duì)應(yīng)的位置繪制子視圖,如此循環(huán)下去就可以得到所有視圖的位置陨闹。

這種布局方式的問(wèn)題就在于不能適應(yīng)不同尺寸的屏幕楞捂。對(duì)于同一個(gè)視圖V,假如希望V在4英寸的屏幕上的寬度為200趋厉,在5.5英寸的屏幕上顯示的為300寨闹,這種布局的模式就很難做到。因此在最開(kāi)始的時(shí)候君账,豎屏到橫屏的轉(zhuǎn)化通常需要繪制兩套布局繁堡。

自動(dòng)布局的原理

自動(dòng)布局的引入解決了不同屏幕尺寸的適配問(wèn)題。

自動(dòng)布局的過(guò)程實(shí)際上是通過(guò)對(duì)于給出的視圖之間的關(guān)系乡数,計(jì)算出各個(gè)視圖的位置的過(guò)程椭蹄。最終還是會(huì)轉(zhuǎn)化成原始的frame的方式來(lái)繪制到屏幕上去。所以自動(dòng)布局的關(guān)鍵有兩點(diǎn)净赴,一是你給出的描述是否能夠讓CPU計(jì)算出其最終的位置绳矩,而是你的描述是不是你最終想要的結(jié)果。對(duì)于第一點(diǎn)玖翅,可能出錯(cuò)的地方在于翼馆,你給出的視圖之間的關(guān)系本身是有沖突的或者給出的視圖之間的關(guān)系不足以完全計(jì)算出視圖的最終位置。

其實(shí)最原始的基于frame的布局也是描述視圖間的關(guān)系金度,子視圖相對(duì)于父視圖x方向上的位置应媚,y方向上的位置,寬度和長(zhǎng)度猜极。自動(dòng)布局在此基礎(chǔ)上擁有多種視圖間關(guān)系的描述中姜。并且很大的一個(gè)不同在于,自動(dòng)布局可以描述任何視圖之前的關(guān)系跟伏,而不僅僅限于子視圖與父視圖的關(guān)系丢胚。

自動(dòng)布局的約束

上面所說(shuō)的“關(guān)系”,在自動(dòng)布局中定義為約束(Constrains)酬姆。

約束可以由兩個(gè)視圖的屬性以及屬性之間的關(guān)聯(lián)決定。

自動(dòng)布局里奥溺,視圖中可以定義為約束的屬性包括:

top辞色,left (leading),bottom,right(trailing)相满,width层亿,length,centerX立美,centerY匿又,center,baseline

其中baseline是文字的基線建蹄,見(jiàn)下圖中的紅線

baseline

屬性之間的關(guān)聯(lián)關(guān)系包括:

相等碌更,大于,小于洞慎,大于等于痛单,小于等于,系數(shù)(multiplier)劲腿,偏移量(constant,offset)

一個(gè)約束可以描述為下圖:

constraint

注意的是除了center外的屬性都是代表位置(或者長(zhǎng)度寬度)的一個(gè)float類型的數(shù)字旭绒,center是centerX和centerY的集合。屬性乘以一個(gè)系數(shù)一般是一個(gè)float乘以系數(shù)焦人。

在自動(dòng)布局中挥吵,我們所要做的就是根據(jù)自己的需求描述出完整并且正確的約束。

完整的實(shí)例(來(lái)自Apple官方文檔):

sample
1. // Vertical Constraints
2. Red.top = 1.0 * Superview.top + 20.0
3. Superview.bottom = 1.0 * Red.bottom + 20.0
4. Blue.top = 1.0 * Superview.top + 20.0
5. Superview.bottom = 1.0 * Blue.bottom + 20.0
6. 
7. // Horizontal Constraints
8. Red.leading = 1.0 * Superview.leading + 20.0
9. Blue.leading = 1.0 * Red.trailing + 8.0
10. Superview.trailing = 1.0 * Blue.trailing + 20.0
11. Red.width = 1.0 * Blue.width + 0.0

其中約束2-5決定了垂直方向的布局花椭,8-11決定了水平方向的布局忽匈。

假設(shè)Superview為一個(gè)100*100的視圖,那么根據(jù)這幾個(gè)約束如何計(jì)算出Red和Blue的具體位置呢个从?

根據(jù)2脉幢,8這兩個(gè)約束可以決定Red的frame為(20,20嗦锐,width嫌松,height)

根據(jù)2,3這兩個(gè)約束可以決定Red的height為100-20-20 = 60奕污;

同理根據(jù)4萎羔,5可以決定Blue的height為60;

根據(jù)9碳默,可以得到 Blue.leading = 20 + Red.width + 8

加上10可以得到 20+Red.width+8+Blue.width+20 = 100

根據(jù)11贾陷,Red.width = Blue.width, 所以變成解方程:20+width+8+width+20 = 100, width = 26;

所以Red的frame為(20嘱根,20髓废,26,60)

Blue.leading = 20+26+8 = 54该抒,所以Blue的frame為(54,20,26,60)

那么如果給出的約束不正確會(huì)怎么樣呢?

假如給出的約束是自相矛盾的慌洪,像Blue.leading = 10, Blue.trailing=5這樣的約束,那么顯然系統(tǒng)就無(wú)法計(jì)算出正確的布局的了。

假設(shè)給出的約束少了冈爹,在上述例子中涌攻,缺少任何一個(gè)約束,系統(tǒng)都無(wú)法準(zhǔn)確計(jì)算出布局频伤。

所以恳谎,再?gòu)?qiáng)調(diào)一遍:在自動(dòng)布局中,我們所要做的就是根據(jù)自己的需求描述出完整并且正確的約束憋肖。 以便于系統(tǒng)自動(dòng)計(jì)算出各個(gè)視圖的frame因痛。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市瞬哼,隨后出現(xiàn)的幾起案子婚肆,更是在濱河造成了極大的恐慌,老刑警劉巖坐慰,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件较性,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡结胀,警方通過(guò)查閱死者的電腦和手機(jī)赞咙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)糟港,“玉大人攀操,你說(shuō)我怎么就攤上這事〗崭В” “怎么了速和?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)剥汤。 經(jīng)常有香客問(wèn)我颠放,道長(zhǎng),這世上最難降的妖魔是什么吭敢? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任碰凶,我火速辦了婚禮,結(jié)果婚禮上鹿驼,老公的妹妹穿的比我還像新娘欲低。我一直安慰自己,他們只是感情好畜晰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布砾莱。 她就那樣靜靜地躺著,像睡著了一般凄鼻。 火紅的嫁衣襯著肌膚如雪腊瑟。 梳的紋絲不亂的頭發(fā)上面哼,一...
    開(kāi)封第一講書(shū)人閱讀 51,165評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音扫步,去河邊找鬼。 笑死匈子,一個(gè)胖子當(dāng)著我的面吹牛河胎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播虎敦,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼游岳,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了其徙?” 一聲冷哼從身側(cè)響起胚迫,我...
    開(kāi)封第一講書(shū)人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎唾那,沒(méi)想到半個(gè)月后访锻,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闹获,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年期犬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片避诽。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡龟虎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出沙庐,到底是詐尸還是另有隱情鲤妥,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布拱雏,位于F島的核電站棉安,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏古涧。R本人自食惡果不足惜垂券,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望羡滑。 院中可真熱鬧菇爪,春花似錦、人聲如沸柒昏。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)职祷。三九已至氏涩,卻和暖如春届囚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背是尖。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工意系, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人饺汹。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓蛔添,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親兜辞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子迎瞧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

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