object-c Masonry 布局框架使用总结
1.Masonry 核心写法
[view mas_makeConstraints:^(MASConstraintMaker *make) {
// 添加约束
}];
// 更新约束(需先有约束)
[view mas_updateConstraints:^(MASConstraintMaker *make) {
// 更新部分约束
}];
// remake 约束(移除旧约束再重建)
[view mas_remakeConstraints:^(MASConstraintMaker *make) {
// 全新设置所有约束
}];
2.mas_equalTo 和 equalTo 的核心区别在于:
mas_equalTo 会自动进行“装箱”操作,支持直接传入基本数据类型(如 100),
equalTo 需要你手动处理类型,只接受对象类型(如 @100),当约束依赖于另一个 视图 的属性时,通常使用 equalTo(父组件相同的属性可以省略)
3.mas_updateConstraints 更新的约束必须是 mas_makeConstraints设置过的约束 否则会有烂七八糟的错误
4.// 在 .pch 或导入 Masonry 之前定义
define MAS_SHORTHAND // 省略 mas_ 前缀
define MAS_SHORTHAND_GLOBALS // equalTo 支持自动装箱
import "Masonry.h"
// 之后全用 equalTo,写法统一
make.width.equalTo(100);
make.left.equalTo(self.view).offset(20);
make.size.equalTo(CGSizeMake(50, 50));
5.[view setNeedsLayout];//标记需要更新布局
[view layoutIfNeeded];//立即更新布局
场景1:需要立即获取最新布局信息
`// 修改约束后想马上知道新的尺寸
[view mas_updateConstraints:^(MASConstraintMaker *make) {
make.width.mas_equalTo(200);
}];
[view setNeedsLayout];
[view layoutIfNeeded]; // 强制立即计算
NSLog(@"新宽度:%.f", view.frame.size.width); // 输出 200场景2:动画中平滑过渡// 修改约束
[self.boxView mas_updateConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.view).offset(300);
}];
// 动画块中调用 layoutIfNeeded
[UIView animateWithDuration:0.3 animations:^{
[self.view layoutIfNeeded]; // 每一帧都更新位置,产生平滑动画
}];`
3.批量更新后一次性刷新
// 同时修改多个视图的约束
[view1 setNeedsLayout];
[view2 setNeedsLayout];
[view3 setNeedsLayout];
// 一次性刷新所有
[self.view layoutIfNeeded]; // 只做一次布局计算,性能更好

浙公网安备 33010602011771号