iOS開發之Autolayout的使用

補充:iPhone6s plus 尺寸:5.5inch   分辨率:1920x1080數組

        iPhone6s  尺寸:4.7inch  分辨率:1334x750
佈局


Autolayout是一種「自動佈局」技術,專門用來佈局UI界面,能很好的解決屏幕適配的問題。Autolayout的兩個核心概念,參照和約束。編碼

在storyboard中處理約束的幾個經常使用面板:spa

    

ViewControllerScene右邊若是出現則說明約束沒有問題了,只須要update frames就行了,若是是則說明約束有問題,多是缺少必要的約束,也多是有兩個約束衝突了。code

除了能夠在storyboard中添加約束,也能夠在代碼中給控件添加約束,可是。。。感受好麻煩啊
orm

主要就是經過NSLayoutConstraint類建立具體的約束對象,並將約束對象添加到相應的view上。對象

添加約束對象方法:ip

- (void)addConstraint:(NSLayoutConstraint *)constraint //添加單個約束

- (void)addConstraints:(NSArray<__kindof NSLayoutConstraint *> *)constraint //添加多個約束

代碼實現Autolayout的注意這幾點,要先禁止autoresizing功能,設置view的下面屬性爲NO,view.translatesAutoresizingMaskIntoConstraints = NO;it

添加約束以前,必定要保證相關控件都已經在各自的父控件上,不用再給view設置frame。io

一個NSLayoutConstraint對象就表明一個約束,建立約束的方法:

NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c];

view1 :要約束的控件

attr1 :約束的類型(作怎樣的約束)

relation :與參照控件之間的關係

view2 :參照的控件

attr2 :約束的類型(作怎樣的約束)

multiplier :乘數

c :常量


添加約束的規則

一、對於兩個同層級view之間的約束關係,添加到它們的父view上。

二、對於兩個不一樣層級view之間的約束關係,添加到他們最近的共同父view上。

三、對於有層次關係的兩個view之間的約束關係,添加到層次較高的父view上。


---------------------------------------------

另外蘋果官方爲了簡化Autolayout的編碼還推出了另外一種語言,vfl(visual format language可視化格式語言)

H:[cancelButton(50)]-10-[acceptButton(50)]  表示   canelButton寬50,acceptButton寬50,它們之間間距10

V:[redView][yellowView(==redView)]  表示  豎直方向上,先有一個redView,其下方緊接一個高度等於redView高度的yellowView

使用VFL來建立約束數組

+ (NSArray *)constraintsWithVisualFormat:(NSString *)format options:(NSLayoutFormatOptions)opts metrics:(NSDictionary *)metrics views:(NSDictionary *)views;

format :VFL語句

opts :約束類型

metrics :VFL語句中用到的具體數值

views :VFL語句中用到的控件

建立一個字典(內部包含VFL語句中用到的控件)的快捷宏定義 NSDictionaryOfVariableBindings(...)

// 間距
NSNumber *margin = @20;
    
// 這條vfl就是水平方向上,blueView左邊距父控件最左邊距20,redView距父控件最右邊距20,blueView和redView中間距離20
NSString *vfl = @"H:|-margin-[blueView]-margin-[redView(==blueView)]-margin-|";
NSDictionary *views = NSDictionaryOfVariableBindings(blueView, redView);
NSDictionary *mertrics = NSDictionaryOfVariableBindings(margin);
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:vfl options:NSLayoutFormatAlignAllTop | NSLayoutFormatAlignAllBottom metrics:mertrics views:views];
[self.view addConstraints:constraints];
相關文章
相關標籤/搜索