iOS VFL(自動布局可視化格式語言)

前言:
1、使用VFL布局前,相關(guān)的View要關(guān)閉系統(tǒng)的自定義布局;
view.translatesAutoresizingMaskIntoConstraints = NO;
2、VFL字符串不可以有空格;


VFL API

/*
format參數(shù): VFL字符串,形如 @"V:|-topMargin-[view1(50.0)]-20-[view2(50.0)]";
option參數(shù): 約束類型 opts參數(shù)是個枚舉值, 主要用來布局view的對齊方式;
metrics參數(shù): 替換VFL字符串中的變量字典, 如果這么寫: @{@"topMargin":@10} 則VFL布局中可以替換成下面的寫法: @"V:|-10-[view1(50.0)]-20-[view2(50.0)]" 其實就是替換字符串中的變量使用;
views參數(shù): VFL語句中用到的控件 views參數(shù)是一個字典,里面可以存儲一些數(shù)值, 這樣存儲之后就可以在VFL字符串中調(diào)用了 為了方便蘋果官方提供了一個宏,傳入相關(guān)的view變量名,返回可以直接使用的dictionary*/
+ (NSArray<__kindof NSLayoutConstraint *> *)constraintsWithVisualFormat:(NSString *)format 
  options:(NSLayoutFormatOptions)opts 
  metrics:(nullable NSDictionary<NSString *,id> *)metrics 
    views:(NSDictionary<NSString *, id> *)views;
  
//views示例
NSDictionaryOfVariableBindings(v1, v2, v3)
//等價于
[NSDictionary dictionaryWithObjectsAndKeys:v1, @”v1”, v2, @”v2”, v3, @”v3”, nil];
 

/*和此方法搭配可以實現(xiàn)更復(fù)雜的布局
view1.attribute1 = view2.attribute2 × multiplier + constant
view1.attribute1 >= view2.attribute2 × multiplier + constant
view1.attribute1 <= view2.attribute2 × multiplier + constant
*/
+ (instancetype)constraintWithItem:(id)view1
                attribute:(NSLayoutAttribute)attr1
                relatedBy:(NSLayoutRelation)relation
                toItem:(nullable id)view2
                attribute:(NSLayoutAttribute)attr2
                multiplier:(CGFloat)multiplier
                constant:(CGFloat)c

VFL布局符號

|  : 表示父視圖
-  : 表示距離(默認(rèn)兩個子視圖之間的值是8,與父視圖之間的值是16)
[] : 表示視圖 (每個視圖必須用[]包裹起來,否則語法錯誤)
() : 定義控件的寬/高,可以在metrics中指定
V  : 表示垂直
H  : 表示水平
=  : 表示視圖間距、寬度和高度必須大于或等于某個值
<= : 表示視圖間距、寬度和高度必須小宇或等于某個值
== : 表示視圖間距、寬度或者高度必須等于某個值
@  : 約束的優(yōu)先級 取值范圍為0~1000(250、750、1000)

VFL布局符號用法

|-[view]-|:                              視圖處在父視圖的左右邊緣內(nèi)(左右會有默認(rèn)邊距)
|-[view]  :                              視圖處在父視圖的左邊緣
|[view]   :                              視圖和父視圖左邊對齊
V:[view(20)]  :                          設(shè)置視圖的高度 
H:[view(20.)]  :                         設(shè)置視圖的寬度
|-10.0-[view]-10.0-|:                    表示離父視圖 左右間距 10
|-[view(view1)]-[view1]-| :              View和view1視圖寬度一樣,并且在父視圖內(nèi)
|-[view(view1)][view1]-|  :              View和view1視圖寬度一樣,并且在父視圖內(nèi),兩視圖間隔為0
V:|-padding-[imageView]->=0-[button]-padding| : 表示離父視圖的距離為Padding,這兩個視圖間距必須大于或等于0并且距離底部父視圖為padding。此時必須對 metrics參數(shù)賦值eg.  metrics:@{@"topMargin":@100};

[wideView(>=60@700)]  :視圖的寬度為至少為60 優(yōu)先級為700 
[view(>=60,<=90)]     :視圖約束多個條件之間用","連接并且之間不能有空格

最后要注意, H可以忽略, 默認(rèn)為水平布局 , V必須要寫!!!

VFL Demo

- (void)viewSafeAreaInsetsDidChange {
    
    //安全高度
    UIEdgeInsets safe_insets = self.view.safeAreaInsets;
    CGFloat topMargin = safe_insets.top > 0 ? safe_insets.top : 60;
    
    //創(chuàng)建3個view的對象
    UIView *leftView = [[UIView alloc]init];
    UIView *rightView = [[UIView alloc]init];
    UIView *bottomView = [[UIView alloc]init];

    //設(shè)置背景顏色
    leftView.backgroundColor = [UIColor greenColor];
    rightView.backgroundColor = [UIColor purpleColor];
    bottomView.backgroundColor = [UIColor orangeColor];

    //添加視圖上顯示
    [self.view addSubview:leftView];
    [self.view addSubview:rightView];
    [self.view addSubview:bottomView];

    //關(guān)閉系統(tǒng)的自定義布局
    leftView.translatesAutoresizingMaskIntoConstraints = NO;
    rightView.translatesAutoresizingMaskIntoConstraints = NO;
    bottomView.translatesAutoresizingMaskIntoConstraints = NO;

    //創(chuàng)建VFL約束字符串
    NSString *h_VFL = @"H:|-[leftView(==rightView)]-margin-[rightView]-space-|";
    NSString *h_VFL1 = @"H:[bottomView(==leftView)]";
    
    NSString *v_VFL = @"V:|-topMargin-[leftView(==bottomView)]-space-[bottomView]-space-|";
    NSString *v_VFL1 = @"V:|-topMargin-[rightView(==bottomView)]";

    //創(chuàng)建鍵值映射
    NSDictionary *metircs = @{@"space":@20,@"margin":@30,@"topMargin":@(topMargin)};
    NSDictionary *views = NSDictionaryOfVariableBindings(leftView,rightView,bottomView);
    
    //創(chuàng)建約束
    NSArray *h_constraint = [NSLayoutConstraint constraintsWithVisualFormat:h_VFL options:0 metrics:metircs views:views];
    NSArray *h_constraint1 = [NSLayoutConstraint constraintsWithVisualFormat:h_VFL1 options:0 metrics:metircs views:views];
    
    NSArray *v_constraint = [NSLayoutConstraint constraintsWithVisualFormat:v_VFL options:NSLayoutFormatDirectionLeadingToTrailing metrics:metircs views:views];
    NSArray *v_constraint1 = [NSLayoutConstraint constraintsWithVisualFormat:v_VFL1 options:NSLayoutFormatDirectionLeadingToTrailing metrics:metircs views:views];
    NSLayoutConstraint *center_x_constraint = [NSLayoutConstraint constraintWithItem:bottomView
                                                                attribute:NSLayoutAttributeCenterX
                                                                relatedBy:NSLayoutRelationEqual
                                                                   toItem:self.view
                                                                attribute:NSLayoutAttributeCenterX
                                                               multiplier:1
                                                                 constant:0];

    //添加約束
    [self.view addConstraints:h_constraint];
    [self.view addConstraints:h_constraint1];
    [self.view addConstraints:v_constraint];
    [self.view addConstraints:v_constraint1];
    [self.view addConstraint:center_x_constraint];
}

寫在最后

Auto Layout Guide: Visual Format Language
iOS--NSLayoutConstraint
自動布局 VFL

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容