Masonry学习之前奏-纯代码实现 AutoLayout

来源:互联网 发布:nginx配置静态目录 编辑:程序博客网 时间:2024/06/07 09:33

在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)

约束计算公式:

view1.attr1 =(view2.attr2 * multiplier)+ c;

添加约束的规则

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

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

代码添加约束的注意事项

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

使用VFL

VFL全称是Visual Format Language,翻译过来是“可视化格式语言”。
VFL是苹果公司为了简化Autolayout的编码而推出的抽象语言。
VFL的原理与代码添加约束是一样的,不同的只是语法,官方给出的语法和示范如下:
官方链接:Visual Format Language

阅读全文
0 0