一.xib界面中使用按鈕添加
Alignment類型的約束添加
alignment約束有9個可添加的類型。
其中最下面的兩個分別是Horizontally:垂直居中對齊;Vertically:水平居中對起;可以設置一個參數,就是偏移量,可以設置為正數或負數,正數是水平向右,負數是水平向左
上面七個都要選中多個View時才可以用,也就是說他不是針對某一個view的布局,而是幾個兄弟view關系的體現,分別可以設置leading、trailing、top、buttom、CenterX、CenterY、Baselines七種。
Lead當前實際坐標哪個在上面其他選中的就等于他,比如實際的上下坐標為A、B、C,那么選中ABC,進行lead約束之后,就會是B.lead=A.lead,C.lead=A.lead。大家都向最上面的A靠齊。
PIN
PIN,是使用最廣泛的約束,其中可以設置某一個View的寬度和高度,某一個view到父View四周的距離,某一個view到四周相鄰其他View的距離。設置某多個View寬度或者高度相同,或者按照比例分配,
PIN中還可以設置Align中的多選性質的七個屬性,但是不能設置便宜參數,只能設置對齊。
二.xib中拖動添加約束
另外在xib頁面還可以拖動添加約束,按住control,點擊并拖動某一個view,就會出現一條線,將這條線拖動空白部位,就可以設置點擊的View與父View相關的約束,拖動到某一個兄弟View就可以設置該View與這個兄弟View相關的約束。
拖動除了在xib的界面中拖動以外,在xib的View列表中按住Control鍵拖動一個View到另一個View或者父View也可以添加他們之間的約束。
三.使用系統方法類代碼添加約束
代碼添加約束主要思想與界面中類似。比如我們要添加一個約束,ViewOne的CenterX等于父View的CenterX,就初始化一個如下的約束對象
//_ViewOne.center.x = self.view.center.x;
NSLayoutConstraint* nowLayOut = [NSLayoutConstraint
constraintWithItem:_ViewOne//被約束View對象
attribute:NSLayoutAttributeCenterX//被約束的值
relatedBy:NSLayoutRelationEqual//約束類型
toItem:self.view//約束依賴對象
attribute:NSLayoutAttributeCenterX//約束的值
multiplier:1.0f
constant:0//偏移量
];
[self.viewaddSubview:nowLayOut];
然后將該約束加入到最大的父View中就可以了。
有一點需要注意,如果需要使用autolayout布局某控件就必須設置該控件Autoresizing屬性為NO。
[_ViewOnesetTranslatesAutoresizingMaskIntoConstraints:NO];
四.使用VFL語言代碼添加約束
使用代碼布局時除了使用系統的對象和方法以外還有一種VFL語言添加約束的方法。下面先看一段使用VFL布局的代碼
-(void)InitLayout
{
//-------------------------------------------下面是進行頁面布局的代碼
//需要進行界面布局的控件或者View需要設置該參數
[m_loginViewsetTranslatesAutoresizingMaskIntoConstraints:NO];
[m_addrViewsetTranslatesAutoresizingMaskIntoConstraints:NO];
[m_logoViewsetTranslatesAutoresizingMaskIntoConstraints:NO];
//添加將進行界面布局的界面元素
NSDictionary*dict=NSDictionaryOfVariableBindings(m_loginView,m_logoView,m_addrView);
//初始化常量
//登錄View
intlwidthNull=(self.view.frame.size.width-m_loginViewWidth)/2;
//LogoView
intllogoWidth=286/2;
intllogoHight=103/2;
intllogoWidthNull=(self.view.frame.size.width-llogoWidth)/2;
//addrView
intladdrWidth=300/2;
intladdrHight=18/2;
intladdrWidthNull=(self.view.frame.size.width-laddrWidth)/2;
intlhightNull=(self.view.frame.size.height-m_loginViewHight-llogoHight-laddrHight)/4;
NSDictionary*metrics
=@{@"LoginViewWidth":[[NSNumberalloc]initWithInt:m_loginViewWidth],
@"LoginViewHight":[[NSNumberalloc]initWithInt:m_loginViewHight],
@"LoginWidthNull":[[NSNumberalloc]initWithInt:lwidthNull],
@"LogoWidth":[[NSNumberalloc]initWithInt:llogoWidth],
@"LogoHight":[[NSNumberalloc]initWithInt:llogoHight],
@"LogoWidthNull":[[NSNumberalloc]initWithInt:llogoWidthNull],
@"AddrWidth":[[NSNumberalloc]initWithInt:laddrWidth],
@"AddrHight":[[NSNumberalloc]initWithInt:laddrHight],
@"AddrWidthNull":[[NSNumberalloc]initWithInt:laddrWidthNull],
@"AllHightNull":[[NSNumberalloc]initWithInt:lhightNull]};
//編輯并加入界面限制
NSString*vfl0 =@"H:|-LoginWidthNull-[m_loginView(LoginViewWidth)]-LoginWidthNull-|";
NSString*vfl1 =@"H:|-LogoWidthNull-[m_logoView(LogoWidth)]-LogoWidthNull-|";
NSString*vfl2 =@"H:|-AddrWidthNull-[m_addrView(AddrWidth)]-AddrWidthNull-|";
NSString*vfl3 =@"V:|-AllHightNull-[m_logoView(LogoHight)]-AllHightNull-[m_loginView(LoginViewHight)]-AllHightNull-[m_addrView(AddrHight)]-AllHightNull-|";
[self.viewaddConstraints:[NSLayoutConstraintconstraintsWithVisualFormat:vfl0options:0metrics:metricsviews:dict]];
[self.viewaddConstraints:[NSLayoutConstraintconstraintsWithVisualFormat:vfl1options:0metrics:metricsviews:dict]];
[self.viewaddConstraints:[NSLayoutConstraintconstraintsWithVisualFormat:vfl2options:0metrics:metricsviews:dict]];
[self.viewaddConstraints:[NSLayoutConstraintconstraintsWithVisualFormat:vfl3options:0metrics:metricsviews:dict]];
}
第一步跟系統方法一樣,先將需要布局添加約束的view對象的Autoresizing屬性設置為NO。
第二步將需要布局的View都添加組成一個字典。
第三步組織布局時需要使用的常量,也組成一個字典。這些常量主要就是一些間隔距離,偏移量等數據。
第四步組建VFL約束語句,這里組建VFL語句其實就是用之前的常量和需要被約束的對象組成一個特殊的字符串。
第五步將組建好的VFL約束語句加入到父View中實現約束。這與系統方法類似。
五.第三方庫添加約束
除了以上所說的幾種方法之外,還有一些優秀的第三方庫可以添加autolayout約束,比如masonry,大家可以了解一下。無論用什么方法,其實思想都一樣,大家可以在實踐中多體會。