iOS中文API之NSLayoutconstraint,nslayoutconstraint
AutoLayout為開發人員提供了一種不同於傳統對於UI元素位置指定的布局方法。以前,不論是在IB裡拖放,還是在代碼中寫,每個UIView都會有自己的frame屬性,來定義其在當前視圖中的位置和尺寸。使用AutoLayout的話,就變為了使用約束條件來定義view的位置和尺寸。這樣的最大好處是一舉解決了不同解析度和螢幕尺寸下view的適配問題,另外也簡化了旋轉時view的位置的定義,原來在底部之上10像素置中的view,不論在旋轉螢幕或是更換裝置(iPad或者iPhone5或者以後可能出現的mini iPad)的時候,始終還在底部之上10像素置中的位置,不會發生變化。
約束定義了兩個使用者借口之間的關係,通過建立約束來滿足我們的要求(可見控制項在布局系統中的位置和尺寸)。每個約束是一個線性方程,具有以下格式:
item1.attribute1 = multiplier × item2.attribute2 + constant
在這個方程式中,attribute1 和 attribute2 是自動布局可以調整時解決這些制約因素的變數。當你建立約束定義其他值。例如,如果您定義兩個按鈕的相對位置,第二個按鈕的起始位置距離第一個按鈕結束位置後8像素點。這種關係為線性方程如下所示:
button2.leading = 1.0 × button1.trailing + 8.0
另外。約束並不局限於平等關係。它們還可以使用大於或等於 (> =) 或小於或等於 (< =) 來描述這兩個屬性之間的關係。約束還具有 1 到 1000 之間的優先順序。具有優先順序 1000 的約束是必需的。小於 1,000 的所有優先順序是可選的。預設情況下,所有約束都是需要 (優先順序 = 1,000)。在解決所要的約束後,AutoLayout將從最高到最低的優先順序順序來處理所有可選約束,如果它不能解決一個可選的約束,它將嘗試來作為儘可能接近所需的結果,然後移動到下一個約束。這種不平等、 平等和優先順序的結合給你強大的靈活性。通過結合多個約束,您可以定義動態地適應使用者介面元素在螢幕中的大小和位置。
建立約束
+ (NSArray<__kindof NSLayoutConstraint *> *)constraintsWithVisualFormat:(NSString *)format options:(NSLayoutFormatOptions)opts metrics:(nullable NSDictionary<NSString *,id> *)metrics views:(NSDictionary<NSString *, id> *)views
通過VFL描述建立約束
參數:
format |
約束的格式規範. |
opts |
選項描述多有對象的屬性和布局的方向 |
metrics |
在可視格式字串中出現的約束dictionary,dictionary的key必須是NSString值,dictionary的value必須是NSNumber類型。 |
views |
視圖dictionary,dictionary的key必須是NSString值,dictionary的value必須是UIView對象。 |
傳回值:
約束的數組
+(instancetype)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(nullable id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c
通過定義給定視圖的指定屬性之間的關聯建立約束
參數:
view1 |
約束左側的視圖 |
attr1 |
約束左側視圖的屬性 |
relation |
約束左側和右側視圖的關係 |
view2 |
約束右側的視圖 |
attr2 |
約束右側視圖的屬性 |
multiplier |
乘數 |
c |
常量值 |
啟用或停用約束
property (getter=isActive) BOOL active
擷取一個約束的狀態。預設為NO。
+ (void)activateConstraints:(NSArray<NSLayoutConstraint *> *)constraints
啟用指定約束數組中的所有約束。
+ (void)deactivateConstraints:(NSArray<NSLayoutConstraint *> *)constraints
停用指定約束數組中的所有約束。
訪問約束資料
@property UILayoutPriority priority
優先順序屬性。如果一個約束的優先順序小於UILayoutPriorityRequired,那麼這個約束是可選的。先滿足高優先順序的約束再可滿足低優先順序的約束。優先順序必須是大於0且小於或等於NSLayoutPriorityRequired。
@property(readonly, assign) id firstItem
參與約束的第一個對象。
@property (readonly) NSLayoutAttribute firstAttribute
第一個對象的屬性。
@property (readonly) NSLayoutRelation relation
約束中,2個屬性的關係。
@property (nullable, readonly, assign) id secondItem
參數約束的第二個對象。
@property (readonly) NSLayoutAttribute secondAttribute;
第二個對象的屬性
枚舉,常量
NSLayoutAttribute
對象的可視化表示形式,用於擷取該約束的值的一部分。
下篇介紹使用方法,本文結束