基础用法
本指南涵盖 Masonry 的核心 API,包括创建、更新和管理 Auto Layout 约束。
创建约束
使用 mas_makeConstraints: 为视图创建约束:
::: code-group
UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(superview.mas_top).with.offset(padding.top);
make.left.equalTo(superview.mas_left).with.offset(padding.left);
make.bottom.equalTo(superview.mas_bottom).with.offset(-padding.bottom);
make.right.equalTo(superview.mas_right).with.offset(-padding.right);
}];
let padding = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
view.mas.makeConstraints { make in
make.top.equalTo(superview.mas.top).offset(padding.top)
make.left.equalTo(superview.mas.left).offset(padding.left)
make.bottom.equalTo(superview.mas.bottom).offset(-padding.bottom)
make.right.equalTo(superview.mas.right).offset(-padding.right)
}
:::
或者使用 edges 更简洁地表达:
::: code-group
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(superview).with.insets(padding);
}];
view.mas.makeConstraints { make in
make.edges.equalTo(superview).inset(padding)
}
:::
等式关系
Masonry 提供三种关系方法:
| 方法 | NSLayoutRelation |
|---|---|
.equalTo | NSLayoutRelationEqual |
.lessThanOrEqualTo | NSLayoutRelationLessThanOrEqual |
.greaterThanOrEqualTo | NSLayoutRelationGreaterThanOrEqual |
属性链
链式调用多个属性:
// 设置 left、right、bottom 等于 superview,top 等于另一个视图
make.left.right.and.bottom.equalTo(superview);
make.top.equalTo(otherView);
优先级
设置约束优先级:
::: code-group
make.left.greaterThanOrEqualTo(label.mas_left).with.priorityLow();
make.top.equalTo(label.mas_top).with.priority(600);
view.mas.makeConstraints { make in
make.width <= 200 ~ .defaultHigh
make.height == 44 ~ 600
}
:::
更新约束
更新已有约束(不存在则创建):
::: code-group
[view1 mas_updateConstraints:^(MASConstraintMaker *make) {
make.leading.equalTo(superview).offset(newPadding);
}];
view.mas.updateConstraints { make in
make.leading.equalTo(superview).offset(newPadding)
}
:::
重建约束
移除所有已有约束并重新创建:
::: code-group
[view1 mas_remakeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(superview).insets(newPadding);
}];
view.mas.remakeConstraints { make in
make.edges.equalTo(superview).inset(newPadding)
}
:::
Swift 运算符
MasonrySwift 模块支持基于运算符的约束创建:
view.mas.makeConstraints { make in
make.top == superview.mas.top + 20
make.left >= superview.mas.left + 16
make.width <= 200
make.height == 44 ~ .defaultHigh // 设置优先级
}
调试
mas_equalTo()、mas_greaterThanOrEqualTo()、mas_lessThanOrEqualTo()、mas_equalToSuperview()、mas_greaterThanOrEqualToSuperview() 和 mas_lessThanOrEqualToSuperview() 等宏会自动将调用处的文件名和行号嵌入到约束的 mas_key 中:
// mas_key 自动设置为 "<文件名>:<行号>"
make.top.mas_equalTo(superview.mas_top).offset(20);
make.left.right.bottom.mas_equalToSuperview();
// 也可以手动添加 key
make.top.equalTo(superview.mas_top).offset(20).key(@"topPin");
// 批量标记视图
MASAttachKeys(titleLabel, avatarView);