前言
作為一個(gè)剛?cè)腴T的IOS開發(fā)人員捌袜,最開始的時(shí)候是在XIB上拖動(dòng)去畫界面。隨著業(yè)務(wù)的需求增長炸枣,我們會(huì)發(fā)現(xiàn)這種方式的布局已經(jīng)不能滿足我們的要求虏等。為解決這種情況,我們會(huì)去用代碼去寫布局适肠。在這一過程中霍衫,我自己是經(jīng)歷了兩步。第一次是在寫布局時(shí)自己去計(jì)算控件的位置侯养,包括控件的x敦跌、y、width逛揩、height峰髓。這種處理方法在最開始的時(shí)候,還是可以去接受的息尺,但是后來在處理一些居中布局以及UILbel的寬度等于內(nèi)容的寬度的情況下携兵,這種方法會(huì)顯得很繁瑣、很愚蠢搂誉。為此我轉(zhuǎn)到了第二步-使用NSLayoutConstraint去寫布局徐紧,這個(gè)過程中自己學(xué)到了很多,在后續(xù)的過程中遇到布局的問題也就小case了炭懊。
因?yàn)楝F(xiàn)在的iPhone手機(jī)屏幕已經(jīng)越來越多并级,所以在寫布局時(shí),一定要寫響應(yīng)式的布局侮腹,在所有的屏幕上的顯示要趨于一致嘲碧。
NSLayouyConstraint
在提到代碼響應(yīng)式布局時(shí),就不得不提到NSLayoutContraint
父阻,通過對控件添加一個(gè)或幾個(gè)約束愈涩,就能得到我們想要的結(jié)果。xib的布局也是使用這個(gè)給各種控件添加約束加矛。
在給控件添加約束的過程中履婉,主要是這個(gè)方法[NSLayoutConstraint constraintWithItem:需要添加約束的控件 attribute:需要約束的屬性 elatedBy:和參照控件屬性的關(guān)系 toItem:參照的控件 attribute:參照控件的屬性 multiplier:比例 constant:固定數(shù)值]
。
針對上面的這個(gè)方法的作用有一個(gè)表達(dá)式可以很好描述:
需要添加約束的控件.需要約束的屬性 = 參照控件.參照屬性 * 比例 + 固定數(shù)值
參數(shù)說明
attribute
attribute:控件的屬性斟览,包括上(NSLayoutAttributeTop
)下(NSLayoutAttributeBottom
)左(NSLayoutAttributeLeft
)右(NSLayoutAttributeRight
)邊距毁腿、寬度(NSLayoutAttributeWidth
)、高度(NSLayoutAttributeHeight
)、水平(NSLayoutAttributeCenterX
)和垂直(NSLayoutAttributeCenterY
)對其等, 詳細(xì)的說明可以去參照NSLayoutAttribute這個(gè)枚舉類型
elateBy
elateBy: 需要約束控件屬性和參照控件屬性之間的關(guān)系已烤,包括小于等于(NSLayoutRelationLessThanOrEqual
)鸠窗、等于(NSLayoutRelationEqual
)和大于等于(NSLayoutRelationGreaterThanOrEqual
)
multiplier
multiplier: 參照控件屬性的比例,是一個(gè)浮點(diǎn)型的數(shù)值
constant
constant: 在比例基礎(chǔ)上增加一個(gè)固定的數(shù)值
下面提供兩個(gè)約束的例子
//self.customTitleLabel 和self.customTitleView垂直方向保持居中對齊
[NSLayoutConstraint constraintWithItem:self.customTitleLabel
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:self.customTitleView
attribute:NSLayoutAttributeCenterY
multiplier:1.0f
constant:0.0f].active = YES;
//self.customTitleImageView 緊跟著 self.customTitleLabel右側(cè)顯示
[NSLayoutConstraint constraintWithItem:self.customTitleImageView
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:self.customTitleLabel
attribute:NSLayoutAttributeRight
multiplier:1.0f
constant:3.0f].active = YES;
注意:在寫完約束之后需要手動(dòng)去激活胯究,這也就是上面最后把
active
置成YES
的原因塌鸯。