代碼約束NSLayoutConstraint

項目中都是用別人封裝好的第三方:masonry加缘,跟未封裝的一比不得不說masony的強大沿侈。前段時間斗忌,一朋友說到約束這塊质礼,在做framework的時候要使用到約束(雖然現(xiàn)在自己還寫不出啥好的framework,但是知識靠積累嘛织阳,不急總有自己發(fā)光的時候)眶蕉,但是總不能強迫讓引用你的framework的開發(fā)者引入第三方庫吧!最近也空閑了唧躲,默默的去找百度造挽,然后整理了一下NSLayoutConstraint碱璃,廢話就不說了,開始干貨刽宪。

NSLayoutConstraint

xib中厘贼,可以用拖拽添加約束界酒,也可以把約束給拖拽出來用代碼來設置約束條件圣拄。看來可視化的約束還是必要學的毁欣。
添加NSLayoutConstraint約束的時候庇谆,先看下控件是否關閉了TranslatesAutoresizingMaskIntoConstraints屬性,如果沒有關閉系統(tǒng)在運行時會自動將Autoresizing Mask轉為Auto Layout的約束凭疮,從而造成沖突饭耳。報錯如下:

TranslatesAutoresizingMaskIntoConstraints為YES的錯誤.png

方法constraintWithItem的使用

/* Create constraints explicitly.  Constraints are of the form "view1.attr1 = view2.attr2 * multiplier + constant" 
 If your equation does not have a second view and attribute, use nil and NSLayoutAttributeNotAnAttribute.
 */
+(instancetype)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(nullable id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c;

Itemview1是你需要設置約束的視圖,view1對應需要做的約束
attribute(attr1):NSLayoutAttribute执解,view1需要約束的位置例如:它的頂部NSLayoutAttributeTop寞肖、底部NSLayoutAttributeBottom、左邊NSLayoutAttributeLeft衰腌、右邊NSLayoutAttributeRight等新蟆。
relatedBy:NSLayoutRelation,view1view2的視圖關系右蕊,例如:NSLayoutRelationEqual琼稻。
toItemview1需要參照約束的對象view2view2可為空饶囚。如果view2為空帕翻,view2的約束為NSLayoutAttributeNotAnAttribute無屬性。
attribute(attr2):NSLayoutAttribute萝风,參考attr1
multiplier:比例view1與view2的倍數(shù)嘀掸,通常為1.0,當你想要view1的寬度等于view2的寬度一半的時候你只需要設置為0.5规惰,constant為0就OK睬塌。
constantview1相對view2偏移的像素距離。

NSLayoutAttribute

typedef NS_ENUM(NSInteger, NSLayoutAttribute) {
    NSLayoutAttributeLeft = 1,        //左側
    NSLayoutAttributeRight,           //右側
    NSLayoutAttributeTop,             //上方
    NSLayoutAttributeBottom,          //下方
    NSLayoutAttributeLeading,         //首部
    NSLayoutAttributeTrailing,        //尾部
    NSLayoutAttributeWidth,           //寬度
    NSLayoutAttributeHeight,          //高度
    NSLayoutAttributeCenterX,         //X軸中心
    NSLayoutAttributeCenterY,         //Y軸中心
    NSLayoutAttributeLastBaseline,    //文本底標線
    NSLayoutAttributeBaseline NS_SWIFT_UNAVAILABLE("Use 'lastBaseline' instead") = NSLayoutAttributeLastBaseline,
    NSLayoutAttributeFirstBaseline NS_ENUM_AVAILABLE_IOS(8_0),
    
    
    NSLayoutAttributeLeftMargin NS_ENUM_AVAILABLE_IOS(8_0),//左邊距
    NSLayoutAttributeRightMargin NS_ENUM_AVAILABLE_IOS(8_0),//右邊距
    NSLayoutAttributeTopMargin NS_ENUM_AVAILABLE_IOS(8_0),//上方邊距
    NSLayoutAttributeBottomMargin NS_ENUM_AVAILABLE_IOS(8_0),//下方邊距
    NSLayoutAttributeLeadingMargin NS_ENUM_AVAILABLE_IOS(8_0),//首部邊距
    NSLayoutAttributeTrailingMargin NS_ENUM_AVAILABLE_IOS(8_0),//尾部邊距
    NSLayoutAttributeCenterXWithinMargins NS_ENUM_AVAILABLE_IOS(8_0),//X軸中心邊距
    NSLayoutAttributeCenterYWithinMargins NS_ENUM_AVAILABLE_IOS(8_0),//Y軸中心邊距
    
    NSLayoutAttributeNotAnAttribute = 0//無屬性
};

NSLayoutRelation

typedef NS_ENUM(NSInteger, NSLayoutRelation) {
    NSLayoutRelationLessThanOrEqual = -1,      //小于或等于
    NSLayoutRelationEqual = 0,                 //等于
    NSLayoutRelationGreaterThanOrEqual = 1,    //大于或等于
};

使用栗子

    _logoLabel = [[UILabel alloc] init];
    [_logoLabel setText:@"上方84卿拴,高度17衫仑,水平居中"];
    [_logoLabel setFont:[UIFont systemFontOfSize:17]];
    [_logoLabel setTextColor:[UIColor redColor]];
    [_logoLabel setTranslatesAutoresizingMaskIntoConstraints:NO];//別忘了這個
    [self.view addSubview:_logoLabel];

約束

//logoLabel的上方距離self.view 的上方想下84
    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.logoLabel attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1.0 constant:84]];
//logoLabel的X軸中心點等于self.view 的X軸中心點,用來讓logoLabel在view上水平居中
    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.logoLabel attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:1]];
//logoLabel的寬度堕花,沒有比較的對象toItem:nil 文狱,所以attr2的屬性為NSLayoutAttributeNotAnAttribute
    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.logoLabel attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:17]];

看下效果圖:

logoLabel栗子圖.jpg

相關屬性說明有了,使用栗子有了缘挽,剩下的約束就看自己了哈瞄崇。當然呻粹,記得如果你要的約束距離是動態(tài)的別把constant設置為固定值,畢竟沒有辣么智能知道你是相對于什么屏幕像素來做約束的苏研。在強調一下等浊,如果要動態(tài)的,別給constant設置固定值摹蘑、別給constant設置固定值筹燕、別給constant設置固定值,強調三遍衅鹿。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末撒踪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子大渤,更是在濱河造成了極大的恐慌制妄,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泵三,死亡現(xiàn)場離奇詭異耕捞,居然都是意外死亡,警方通過查閱死者的電腦和手機烫幕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門俺抽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纬霞,你說我怎么就攤上這事凌埂。” “怎么了诗芜?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵瞳抓,是天一觀的道長。 經常有香客問我伏恐,道長孩哑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任翠桦,我火速辦了婚禮横蜒,結果婚禮上,老公的妹妹穿的比我還像新娘销凑。我一直安慰自己丛晌,他們只是感情好,可當我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布斗幼。 她就那樣靜靜地躺著澎蛛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蜕窿。 梳的紋絲不亂的頭發(fā)上谋逻,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天呆馁,我揣著相機與錄音,去河邊找鬼毁兆。 笑死浙滤,一個胖子當著我的面吹牛,可吹牛的內容都是我干的气堕。 我是一名探鬼主播纺腊,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼送巡!你這毒婦竟也來了摹菠?” 一聲冷哼從身側響起盒卸,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤骗爆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蔽介,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體摘投,經...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年虹蓄,在試婚紗的時候發(fā)現(xiàn)自己被綠了犀呼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡薇组,死狀恐怖外臂,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情律胀,我是刑警寧澤宋光,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站炭菌,受9級特大地震影響罪佳,放射性物質發(fā)生泄漏。R本人自食惡果不足惜黑低,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一赘艳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧克握,春花似錦蕾管、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至勋眯,卻和暖如春婴梧,著一層夾襖步出監(jiān)牢的瞬間下梢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工塞蹭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留孽江,地道東北人。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓番电,卻偏偏與公主長得像岗屏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子漱办,可洞房花燭夜當晚...
    茶點故事閱讀 44,974評論 2 355

推薦閱讀更多精彩內容