masonry 优先级怎么使用

 我来答
帐号已注销
2017-05-20 · TA获得超过665个赞
知道答主
回答量:483
采纳率:50%
帮助的人:97.2万
展开全部

自动布局最重要的是约束:UI元素间关系的数学表达式。约束包括尺寸、由优先级和阈值管理的相对位置。它们是添加剂,可能导致约束冲突 、约束不足造成布局无法确定 。这两种情况都会产生异常。

使用前:AutoLayout关于更新的几个方法的区别

setNeedsLayout:告知页面需要更新,但是不会立刻开始更新。执行后会立刻调用layoutSubviews。

layoutIfNeeded:告知页面布局立刻更新。所以一般都会和setNeedsLayout一起使用。如果希望立刻生成新的frame需要调用此方法,利用这点一般布局动画可以在更新布局后直接使用这个方法让动画生效。

layoutSubviews:系统重写布局

setNeedsUpdateConstraints:告知需要更新约束,但是不会立刻开始

updateConstraintsIfNeeded:告知立刻更新约束

updateConstraints:系统更新约束

使用

  1. 基本使用

  2. mas_makeConstraints:添加约束

  3. mas_updateConstraints:更新约束、亦可添加新约束

  4. mas_remakeConstraints:重置之前的约束

  5. multipler属性表示约束值为约束对象的乘因数, dividedBy属性表示约束值为约束对象的除因数,可用于设置view的宽高比

  6. // 进行屏幕的适配的时候,往往需要根据屏幕宽度来适配一个相应的高度,在此使用如下约束的方式来进行控件的适配

  7. [self.topView addSubview:self.topInnerView];

  8. [self.topInnerView mas_makeConstraints:^(MASConstraintMaker *make) {

  9. make.height.equalTo(self.topView.mas_height).dividedBy(3);

  10. make.width.and.height.lessThanOrEqualTo(self.topView);

  11. make.width.and.height.equalTo(self.topView).with.priorityLow();

  12. make.center.equalTo(self.topView);

  13. }];

  14. priorityLow()设置约束优先级

  15. #define MAS_SHORTHAND_GLOBALS使用全局宏定义,可以使equalTo等效于mas_equalTo

  16. #define MAS_SHORTHAND使用全局宏定义, 可以在调用masonry方法的时候不使用mas_前缀

  17. // 这里注意到一个地方,就是当使用了这个全局宏定义之后,发现可以有个类`NSArray+MASAdditions.h`,看了之后发现可以

  18. self.buttonViews = @[ raiseButton, lowerButton, centerButton ];

  19. // 之后可以在updateConstraints 方法中

  20. - (void)updateConstraints {

  21. [self.buttonViews updateConstraints:^(MASConstraintMaker *make) {

  22. make.baseline.equalTo(self.mas_centerY).with.offset(self.offset);

  23. }];

  24. [super updateConstraints];  

  25. }

动态修改视图约束:

// 创建视图约束

[blueView mas_makeConstraints:^(MASConstraintMaker *make) {

self.animatableConstraint = make.edges.equalTo(superview).insets(paddingInsets).priorityLow();

]];

// 更改约束 (另一处方法中)

UIEdgeInsets paddingInsets = UIEdgeInsetsMake(padding, padding, padding, padding);

self.animatableConstraint.insets = paddingInsets;

[self layoutIfNeeded];


debug模式:

// 对某个view添加key值

greenView.mas_key = @"greenView";

// 或者如下顺序

MASAttachKeys(greenView, redView, blueView, superview);

// 同样的对每条约束亦可以添加key

make.height.greaterThanOrEqualTo(@5000).key(@"ConstantConstraint");


preferredMaxLayoutWidth: 多行label的约束问题

// 已经确认好了位置

// 在layoutSubviews中确认label的preferredMaxLayoutWidth值

- (void)layoutSubviews {

[super layoutSubviews];

// 你必须在 [super layoutSubviews] 调用之后,longLabel的frame有值之后设置preferredMaxLayoutWidth

self.longLabel.preferredMaxLayoutWidth = self.frame.size.width-100;

// 设置preferredLayoutWidth后,需要重新布局

[super layoutSubviews];

}


scrollView使用约束的问题:原理通过一个contentView来约束scrollView的contentSize大小,也就是说以子控件的约束条件,来控制父视图的大小

// 1. 控制scrollView大小(显示区域)

[self.scrollView makeConstraints:^(MASConstraintMaker *make) {

make.edges.equalTo(self.view);

}];

// 2. 添加一个contentView到scrollView,并且添加好约束条件

[contentView makeConstraints:^(MASConstraintMaker *make) {

make.edges.equalTo(self.scrollView);

// 注意到此处的宽度约束条件,这个宽度的约束条件是比添加项

make.width.equalTo(self.scrollView);

}];

// 3. 对contentView的子控件做好约束,达到可以控制contentView的大小


新方法:2个或2个以上的控件等间隔排序

/**

*  多个控件固定间隔的等间隔排列,变化的是控件的长度或者宽度值

*

*  @param axisType        轴线方向

*  @param fixedSpacing    间隔大小

*  @param leadSpacing     头部间隔

*  @param tailSpacing     尾部间隔

*/

- (void)mas_distributeViewsAlongAxis:(MASAxisType)axisType 

withFixedSpacing:(CGFloat)fixedSpacing l

eadSpacing:(CGFloat)leadSpacing 

tailSpacing:(CGFloat)tailSpacing;


/**

*  多个固定大小的控件的等间隔排列,变化的是间隔的空隙

*

*  @param axisType        轴线方向

*  @param fixedItemLength 每个控件的固定长度或者宽度值

*  @param leadSpacing     头部间隔

*  @param tailSpacing     尾部间隔

*/

- (void)mas_distributeViewsAlongAxis:(MASAxisType)axisType 

withFixedItemLength:(CGFloat)fixedItemLength 

leadSpacing:(CGFloat)leadSpacing 

tailSpacing:(CGFloat)tailSpacing;


使用方法很简单,因为它是NSArray的类扩展:

//  创建水平排列图标 arr中放置了2个或连个以上的初始化后的控件

//  alongAxis 轴线方向   固定间隔     头部间隔      尾部间隔

[arr mas_distributeViewsAlongAxis:MASAxisTypeHorizontal withFixedSpacing:20 leadSpacing:5 tailSpacing:5];

[arr makeConstraints:^(MASConstraintMaker *make) {

make.top.equalTo(@60);

make.height.equalTo(@60);

}];

中智咨询
2024-08-28 广告
在当今竞争激烈的商业环境中,企业需要不断提高自身的竞争力,以保持市场份额和增加利润。通过人效提升,企业可以更有效地利用有限的资源,提高生产力和效益,从而实现盈利目标。中智咨询提供全方位的组织人效评价与诊断、人效提升方案等数据和管理咨询服务。... 点击进入详情页
本回答由中智咨询提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式