Autolayout(VFL)

Autolayout(VFL)
一、NSLayoutConstraint
+ (NSArray *)constraintsWithVisualFormat:(NSString *)format options:(NSLayoutFormatOptions)opts metrics:(NSDictionary *)metrics views:(NSDictionary *)views;
format:此參數爲你的vfl語句,好比:@"H:|-[button]-|"
opts:枚舉參數,默認寫0
metrics:這裏是一個字典,當在format中使用了動態數據好比上現這句:@"H:|-[button(==width)]-|",表示這個button的寬度爲width,那麼這個參數去哪裏找呢?就是在這個字典裏面找到key對就的值,若是沒有找到這個值,app會crash
views:是傳全部你在vfl中使用到的view,NSDictionaryOfVariableBindings(button).若是你使用到了多個view,就能夠這樣 NSDictionaryOfVariableBindings(button,button1,button3...),這個名字也要跟參數 format中的一一對應,缺一不可.
二、添加約束
UIView
- (void)addConstraints:(NSArray *)constraints;
三、簡單的使用
  UIView *view = [[UIView alloc] init];//若是使用了vfl,能夠忽略視圖的frame,避免與後面的約束條件衝突
view.backgroundColor = [UIColor grayColor];    view.translatesAutoresizingMaskIntoConstraints = NO;//這一句必須有,若是要實現自動佈局,必須將此屬性設置爲no,不然約束不生效
[self.view addSubview:view];
NSArray *arr = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[view]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view)];//設置約束條件,表明距離父View左右各20像素
NSArray *arr1 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-40-[view(==200)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view)];//設置約束,表示距離頂部40像素,view的高度爲200
[self.view addConstraints:arr1];//添加約束
[self.view addConstraints:arr];
四、vfl還能夠針對兩個平級的view進行設置
  NSArray *arr3 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[view]-30-[view1]-20-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view,view1)];//表示View1的縱座標比view 的多30像素,此時最後一個參數views,須要把涉及的兩個view都傳進去
 
根據屏幕尺寸設定縮放
五、以iPhone5待屏幕爲標準,根據六、6p相對於5的比例進行縮放
六、獲取屏幕寬度
#define  WIDTH              [UIScreen mainScreen].bounds.size.width
七、獲取比例
#define SCALE (WIDTH/320.0)
八、自定義rect宏
#define CGRect1(x,y,width,heigth)  CGRectMake(x*SCALE, y*SCALE, width*SCALE, heigth*SCALE)
九、使用
  UIView *view = [[UIView alloc] initWithFrame:CGRect1(10, 10, 300, 548)];
 
具體代碼:
 
一、
//注意使用VFL,不用設置視圖的frame
    UIView *view = [[UIView alloc] init];
    view.backgroundColor = [UIColor brownColor];
    [self.view addSubview:view];
    view.translatesAutoresizingMaskIntoConstraints = NO;//注意,要想使約束條件起做用,必須將此屬性設置爲no
 
     VFL相關的標識符
     H:表明水平方向
     V:表明垂直方向
     |表明父視圖
     - 表明距離 例(H:|-20-)表示距離父視圖左側20像素
     []表明子視圖相關屬性
     
    //對子視圖View進行約束設置,format表示要設置的約束語句,在本句中意思爲:view距離父視圖左側30像素,距離父視圖右側20像素(若是沒設置具體的數字,且寫了-)
    //options表明對其方式,默認寫0就行
    //metrics 這裏是一個字典,當在format中使用了動態數據好比上現這句:@"H:|-[button(==width)]-|",表示這個button的寬度爲width,那麼這個參數去哪裏找呢?就是在這個字典裏面找到key對就的值,若是沒有找到這個值,app會crash
    //views 表明約束條件中所涉及的全部視圖(父視圖除外)
    NSArray *arr = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-30-[view]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view)];
    NSArray *arr1 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20-[view]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view)];
    [self.view addConstraints:arr];
    [self.view addConstraints:arr1];
 
二、
 
UIView *view = [[UIViewalloc] init];
    view.backgroundColor = [UIColor grayColor];
    [self.view addSubview:view];
    view.translatesAutoresizingMaskIntoConstraints =  NO;
    //[view(>=200)]  表示給view設置尺寸,此時小括號裏的關係運算符只能是 == <= >=,注意,改尺寸的值不要與約束衝突,==:約束能夠不寫,簡寫成H:[view(==200)]    >=:當左右距離只設置了一個或者都未設置,視圖的尺寸爲最小值,若是兩個都設置時,view 的尺寸爲屏幕寬度減去左右距離,此時要保證減後的值>=尺寸最小值
   
    NSArray *arr = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[view(>=200)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view)];
     NSArray *arr1 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20-[view(==100)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view)];
    [self.view addConstraints:arr1];
    [self.view addConstraints:arr];
 
三、
UIView *view = [[UIView alloc] init];
    view.backgroundColor = [UIColor grayColor];
    [self.view addSubview:view];
    view.translatesAutoresizingMaskIntoConstraints =  NO;
    CGFloat width = 200;
    //當咱們在設置約束條件時,距離父視圖上下左右的像素值以及view的尺寸不是固定的數字(用某個字符串代替),這時咱們須要給metrics設置一個字典,該字典的key必須是約束語句中使用的字符串,對應的value能夠自行設置
    //@30表示轉化爲NSnumber類型的,@(30)表示轉化爲字符串格式
    NSArray *arr = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-left-[view(==width)]" options:0 metrics:@{@"width":[NSNumber numberWithFloat:width],@"left":@30} views:NSDictionaryOfVariableBindings(view)];
    NSArray *arr1 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20-[view(==100)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view)];
    [self.view addConstraints:arr1];
    [self.view addConstraints:arr];
 
四、
UIView *view = [[UIView alloc] init];
    view.backgroundColor = [UIColor grayColor];
    [self.view addSubview:view];
    view.translatesAutoresizingMaskIntoConstraints =  NO;
    CGFloat width = 200;
    //當咱們在設置約束條件時,距離父視圖上下左右的像素值以及view的尺寸不是固定的數字(用某個字符串代替),這時咱們須要給metrics設置一個字典,該字典的key必須是約束語句中使用的字符串,對應的value能夠自行設置
    NSArray *arr = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-left-[view(==width)]" options:0 metrics:@{@"width":[NSNumber numberWithFloat:width],@"left":@30} views:NSDictionaryOfVariableBindings(view)];
    NSArray *arr1 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20-[view(==100)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view)];
    [self.view addConstraints:arr1];
    [self.view addConstraints:arr];
   UIView *view1 = [[UIView alloc] init];
    view1.backgroundColor = [UIColor purpleColor];
    [self.view addSubview:view1];
    view1.translatesAutoresizingMaskIntoConstraints = NO;
    //[view1(view)] 表明view1和view某個方向尺寸相同
    NSArray *arr2 = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[view1(view)]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view1,view)];
   //V:[view]-[view1]-20-|:子視圖view1垂直方向距離平級子視圖view 8像素(默認)
    NSArray *arr3 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[view]-[view1]-20-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view,view1)];
    [self.view addConstraints:arr2];
    [self.view addConstraints:arr3];
 
五、 //用VFL實現label自適應
UILabel *label = [[UILabel alloc] init];
    label.backgroundColor = [UIColor grayColor];
    label.numberOfLines = 0;
    label.lineBreakMode = NSLineBreakByCharWrapping;
    label.text = @"hiwehfdiuwehdiowqhdoiwehjdoiuwehdiouwhediuwheioudhewiuodhwehoihiuhiuhiuhiluhiuhiuhiuhihuhuuhhuh";
    [self.view addSubview:label];
    label.translatesAutoresizingMaskIntoConstraints = NO;
    NSArray *arr = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[label]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(label)];
    NSArray *arr1 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20-[label]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(label)];
    [self.view addConstraints:arr];
    [self.view addConstraints:arr1];
相關文章
相關標籤/搜索