iOS開發(fā)之譯《Programming iOS9》“Create constraints in code”

前言:繼上篇--翻譯《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))

附件:


上面代碼對(duì)應(yīng)的結(jié)果,代碼注釋在github上

現(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è)名詞的解釋

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末前塔,一起剝皮案震驚了整個(gè)濱河市嚣艇,隨后出現(xiàn)的幾起案子承冰,更是在濱河造成了極大的恐慌华弓,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件困乒,死亡現(xiàn)場(chǎng)離奇詭異寂屏,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)娜搂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門迁霎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人百宇,你說我怎么就攤上這事考廉。” “怎么了携御?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵昌粤,是天一觀的道長(zhǎng)既绕。 經(jīng)常有香客問我,道長(zhǎng)涮坐,這世上最難降的妖魔是什么凄贩? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮袱讹,結(jié)果婚禮上疲扎,老公的妹妹穿的比我還像新娘。我一直安慰自己捷雕,他們只是感情好椒丧,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著救巷,像睡著了一般瓜挽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上征绸,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天久橙,我揣著相機(jī)與錄音,去河邊找鬼管怠。 笑死淆衷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的渤弛。 我是一名探鬼主播祝拯,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼她肯!你這毒婦竟也來了佳头?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤晴氨,失蹤者是張志新(化名)和其女友劉穎康嘉,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體籽前,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡亭珍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了枝哄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肄梨。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖挠锥,靈堂內(nèi)的尸體忽然破棺而出众羡,到底是詐尸還是另有隱情,我是刑警寧澤蓖租,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布粱侣,位于F島的核電站辆毡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏甜害。R本人自食惡果不足惜舶掖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望尔店。 院中可真熱鬧眨攘,春花似錦、人聲如沸嚣州。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽该肴。三九已至情竹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匀哄,已是汗流浹背秦效。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留涎嚼,地道東北人阱州。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像法梯,于是被迫代替她去往敵國(guó)和親苔货。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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