前言:繼上篇--翻譯《Programing iOS9》- Autolayout篇(一)
上篇中只翻譯了與Autolayout有關(guān)的詞的含義。
這篇翻譯“Create constraints in code”
所有代碼均在github上
Create constraints in code
我們已經(jīng)準(zhǔn)備好了用代碼來寫約束枢希。我會(huì)在這里通過NSLayoutConstraint
初始化方法init(item:attribute:relateBy:toItem:attribute:multiplier:constant)
開始恒水,同時(shí)設(shè)置好每一個(gè)約束的屬性值椎组,下面我也會(huì)描述他們的含義。(除了priority,它的初始值是1000布轿,但是可以在后來設(shè) 置如果需要的話)<br >
接下來我會(huì)生成相同的view奠蹬、subviews朝聋、布局行為像圖1-12和圖1-13那樣,但是在這里應(yīng)用constraints囤躁。注意到我不會(huì)想之前創(chuàng)建那樣給subviews v2和v3確定的frames冀痕,因?yàn)閏onstraints會(huì)給他們布局,與此同時(shí)狸演,我記得設(shè)置他們的translatesAutoresizingMaskIntoConstraints
屬性為false:
// 代碼在這里顯示言蛇,不過現(xiàn)在工程文件里使用了之后再來這里
let v1 = UIView(frame: CGRect(x: 100, y: 111, width: 132, height: 194))
v1.backgroundColor = UIColor(red: 1, green: 0.4, blue: 1, alpha: 1)
let v2 = UIView()
v2.backgroundColor = UIColor(red: 0.5, green: 1, blue: 0, alpha: 1)
let v3 = UIView()
v3.backgroundColor = UIColor(red: 1, green: 0, blue: 0, alpha: 1)
view.addSubview(v1)
v1.addSubview(v2)
v1.addSubview(v3)
v2.translatesAutoresizingMaskIntoConstraints = false
v3.translatesAutoresizingMaskIntoConstraints = false
v1.addConstraint(NSLayoutConstraint(item: v2,
attribute: .Leading,
relatedBy: .Equal,
toItem: v1,
attribute: .Leading,
multiplier: 1,
constant: 0))
v1.addConstraint(NSLayoutConstraint(item: v2,
attribute: .Trailing,
relatedBy: .Equal,
toItem: v1,
attribute: .Trailing,
multiplier: 1,
constant: 0))
v1.addConstraint(NSLayoutConstraint(item: v2,
attribute: .Top,
relatedBy: .Equal,
toItem: v1,
attribute: .Top,
multiplier: 1,
constant: 0))
v2.addConstraint(NSLayoutConstraint(item: v2,
attribute: .Height,
relatedBy: .Equal,
toItem: nil,
attribute: .NotAnAttribute,
multiplier: 1,
constant: 10))
v3.addConstraint(NSLayoutConstraint(item: v3,
attribute: .Width,
relatedBy: .Equal,
toItem: nil,
attribute: .NotAnAttribute,
multiplier: 1,
constant: 20))
v3.addConstraint(NSLayoutConstraint(item: v3,
attribute: .Height,
relatedBy: .Equal,
toItem: nil,
attribute: .NotAnAttribute,
multiplier: 1,
constant: 20))
v1.addConstraint(NSLayoutConstraint(item: v3,
attribute: .Trailing,
relatedBy: .Equal,
toItem: v1,
attribute: .Trailing,
multiplier: 1,
constant: 0))
v1.addConstraint(NSLayoutConstraint(item: v3,
attribute: .Bottom,
relatedBy: .Equal,
toItem: v1,
attribute: .Bottom,
multiplier: 1,
constant: 0))
附件:
現(xiàn)在宵距,我知道你在想什么??腊尚。你一定在想:“你在干嘛,你這個(gè)瘋子满哪?那可是一大堆(boat)代碼婿斥!”(除非你可能想要使用其他的四個(gè)詞語而不是“boat”)但是這里有一些假象,我一會(huì)兒會(huì)證明我們剛剛做的比之前我們使用確定的frames和autoresizing創(chuàng)建的這個(gè)界面簡(jiǎn)單很多哨鸭。
譯者注:直譯的話真的很搞笑民宿,但還是直譯吧。??
畢竟像鸡,我們很少使用8個(gè)簡(jiǎn)單的代碼創(chuàng)建8個(gè)contraints
活鹰。(我會(huì)已經(jīng)把每一行代碼分成了多行,但那僅僅是格式的問題只估。)他們是冗長(zhǎng)的志群,但是他們都是一些簡(jiǎn)單的代碼與不同的參數(shù)的重復(fù),所以創(chuàng)建他們僅僅是復(fù)制/粘貼仅乓。此外赖舟,我們創(chuàng)建的八個(gè)contraints
確定了兩個(gè)子view的position、size和layout行為夸楣,所以我們獲得了直接的一躍宾抓。
更能說明問題的是子漩,那些contraints相比設(shè)置frame和autoresizing是一種對(duì)將要達(dá)到的效果更加清晰的表達(dá)。子view的position只被描述了一次石洗,同時(shí)所有的字view都會(huì)隨著superview的改變而改變幢泼。這段描述是意味聲長(zhǎng)的,我們不用使用任意數(shù)學(xué),就像我們之前調(diào)用那樣:
let v3 = UIView(frame:CGRectMake(v1.bounds.width - 20,
v1.bounds.height - 20, 20, 20))
這樣做比較麻煩的是需要用superview的width和height減去該view的width和height才可以得到該view的position讲衫,這樣做也是容易困惑和出錯(cuò)的缕棵。用了contraints之后,我們可以直接地說涉兽,constraints是清晰簡(jiǎn)單明了的招驴,“v3寬為20points,高為20points枷畏,而且與v1的右下部齊平别厘。”
初次之外拥诡,contraints可以做很多autoresizing不能做的事情触趴。舉個(gè)例子,除了給v2一個(gè)絕對(duì)的高度渴肉,我們還可以要求其高度為v1高度10分之一冗懦,而不管v1的size怎么變化。如果我們想做到那樣而不用constraints的話仇祭,我們不得不繼承l(wèi)ayoutSubviews披蕉,在代碼里手動(dòng)完成。
OVER<br >
下一篇:Anchor notation<br >
上一篇:Autolayout各個(gè)名詞的解釋