ios 約束(三)

創建約束規則

    通過NSLayoutConstraint類,開發者可以用兩種方式來創建約束規則。可以用一個相當長的方法調用語句來指明視圖的某個屬性與其他屬性之間的關係,並描述這些屬性之間的聯繫,也可以用一種寫起來非常短小的格式化語言來指定視圖在水平方向與垂直方向上的排布形式。

    記住:無論怎麼樣構建約束規則,他們所產生的結果都是類似“y關係mx + b”這樣的關係式。不論創建了何種約束規則,他們都是NSLayoutConstraint類的成員。

 1、基本約束規則聲明

    NSLayoutConstraint類的constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:方法一次能夠創建一條約束規則。這些規則可以把一個視圖同另一個視圖關聯起來。

    這個方法會創建出嚴格的”view.attribute R view.attribute * multiplier + constant“關係式。其中R可以是”等於(==)、大於等於(>=)、小於等於(<=)“。

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:_textfield attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0]];

    這段代碼會向視圖控制器的視圖裏添加一條新的約束規則,它會把文本框中心點的橫座標與本視圖中心點的橫座標對齊。具體來說,就是在兩個視圖中心點的橫座標之間設立等同關係。放大倍數是1,偏移量是0.這就產生了上面的關係式。

    這個關係式的意思是:請把本視圖中心點的X座標與文本框中心點的X座標對齊。UIView的addConstraint:方法會把這條約束規則添加到視圖之中,該規則與其他的約束規則都會存放在視圖的constraints屬性裏。

2、用可視化格式字符串聲明約束規則

    NSLayoutConstraint類裏還有個方法,可以根據字符串來創建約束規則,這種字符串使用基於文本的視覺格式語言來表示其內容。這就好比給OC語言高手設計的一套ASCII看下面例子:

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[leftLabel]-25-[rightLabel]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(leftLabel,rightLabel)]];

    上面的這行代碼會根據可視化格式字符串的內容創建出一套約束規則,以滿足其中的關係。它們用來表述視圖的橫軸(H)與縱軸(V)方向上與其他視圖的關係。本例所用的這個字符串的意思就是說:確保rightLabel出現來leftLabel下方15點處。

    創建這種格式字符串的時候要注意下面這些事項:

    1、先用H:或V:前綴來指明規則所針對的軸。

    2、字符串裏指代視圖的變量名都用方括號括起來。

    3、兩控件之間的固定間距用左右帶“-”的常量來表示,例如-15-。

    4、本例沒有使用選項(options參數),不過開發者可以藉此來指定對齊的方向是從左至右、從右至左還是從頭至尾。

    5、本例也沒有使用metrics參數,開發者可以把一份字典穿進去,並在其中提供一些約束規則所用到的常量,這樣就不用再去專門創建相關的格式字符串了。比方說,我們想令兩個文本標籤之間的間距可變,那麼請將本例中的15替換成某個指標的名字,然後把該指標的值放在metrics字典裏面。字典的鍵是指標的名稱,而值的類型則是NSNumber。傳入這樣一個字典比每次用到一種寬度時都去創建新的NSString實例要簡單許多。

    6、views:參數的實際意義與其名稱不同,他不是個包含視圖的數組。我們要給該參數傳入含有變量綁定的字典。這種字典會把作爲變量名的字符串與變量所指代的視圖關聯起來。執行了這樣一種操作之後,開發者就可以在格式字符串裏使用諸如leftLabel及rightLabel等有意義的符號了。

    用格式字符串來構建約束規則時,總會產生一個包含若干約束規則的數組。某些格式字符串相當複雜,另外一些則比較簡單。我們不太容易看出來每個字符串到底會產生多少約束規則。請注意:constraintsWithVisualFormat方法會製作出能夠滿足格式字符串的一系列約束規則,而開發者要把這些規則全都添加到視圖裏面去。

3、變量綁定

    Auto Layout系統在處理可視化的約束字符串時,需要把leftLabel及rightLabel等視圖名稱與它們所表示的實際視圖對應起來。這是就需要用到變量綁定了,我們通過NSLayoutConstraint.h文件裏定義的宏來執行變量綁定,該文件是UIKit中的一個頭文件。

    NSDictionaryOfVariableBindings()宏以任意數量的局部變量作爲參數。正如大家在早前的範例彙總所看到的,這些參數最後不需要添加上nil。該宏會根據傳入的變量構建一份字典,其中每個條目的鍵都是變量名,而值則是變量本身。比方說,如果執行下面這條語句:

NSDictionaryOfVariableBindings(leftLabel,rightLabel)

    如果你不想使用這個宏,那麼不妨手工製作一份字典,並把它傳給使用可視化格式字符串的約束規則構建器。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章