天天看点

Masonry学习之前奏-纯代码实现 AutoLayout代码添加约束使用VFL

在iOS6之前,大家都是通过UI控件的Frame属性和Autoresizing Mask来进行UI布局的。AutoLayout则是苹果公司在iOS6推出的一种基于约束的,描述性的布局系统。

Autolayout的使用又有多种方式:

- 使用storyboard或xib在可视化界面中添加约束

- 使用代码添加约束

- 使用VFL(Visual Format Language)语言来添加约束

- 使用第三方库,比如Masonry

代码添加约束

创建约束

NSLayoutConstraint *constrait = [NSLayoutConstraint
 constraintWithItem:view1                                                                  
 attribute:attr1                                                                  
 relatedBy:relation                                                                 
 toItem:view2                                                            
 attribute:attr2                                                            
 multiplier:multiplier                                                                
 constant:c];
           

该函数有多达7个参数,简单解释如下:

view1: 要约束的控件
attr1: 约束的类型(如NSLayoutAttributeLeft,是枚举常量)
relation: 与参照控件之间的关系,包括等于、大于等于、小于等于(如NSLayoutRelationEqual 是指等于,是枚举常量)
view2: 参照的控件
attr2: 约束的类型(如NSLayoutAttributeLeft,是枚举常量)
multiplier: 乘数,就是多少倍(1.0)
c: 常量,做好了上述的约束之后会加上这个常量(100)
           

约束计算公式:

添加约束的规则

在创建约束了之后,需要将其添加到作用的控件上才能生效:

- (void)addConstraint:(NSLayoutConstraint *)constraint NS_AVAILABLE_IOS();
 - (void)addConstraints:(NSArray<__kindof NSLayoutConstraint *> *)constraints; 
           
  • 对于两个同层级 view 之间的约束关系,添加到它们的父 view 上。
  • 对于两个不同层级 view 之间的约束关系,添加到他们最近的共同父 view 上。
  • 对于有层次关系的两个 view 之间的约束关系,添加到层次较高的父 view 上。
  • 对于比如长宽之类的,只作用在该 view 自己身上的话,添加到该 view 自己上。

代码添加约束的注意事项

  • 要先禁止 autoresizing 功能,防止 AutoresizingMask 转换成 Constraints,避免造成冲突,需要设置 view 的下面属性为 NO:
  • 添加约束之前,一定要保证相关控件都已经在各自的父控件上。
  • 不用再给 view 设置 frame。

使用VFL

VFL全称是Visual Format Language,翻译过来是“可视化格式语言”。

VFL是苹果公司为了简化Autolayout的编码而推出的抽象语言。

VFL的原理与代码添加约束是一样的,不同的只是语法,官方给出的语法和示范如下:

官方链接:Visual Format Language