前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Autolayout

Autolayout

作者头像
用户1890628
发布2019-08-07 15:31:56
4250
发布2019-08-07 15:31:56
举报
文章被收录于专栏:Objective-CObjective-C

<h3 id=ConstraintPriority>约束优先级问题</h3>

<h4 id=UseMasonry>使用Masonry</h4>

一行两个Label,距离屏幕左右边距各15,测试不同文字内容长度时Label的显示情况,以及通过设置优先级后Label的显示情况来透彻理解约束优先级问题。

  • ContentHuggingPriority表示当前的Label的内容不想被拉伸;
  • 默认HuggingPriority == 250
  • 值越大越不被拉伸(最大1000)

  • ContentCompressionResistancePriority表示当前的Label的内容不想被收缩;
  • 默认CompressionResistancePriority == 750
  • 值越大越不被收缩(最大1000)
代码语言:javascript
复制
@interface ViewController ()

@property (nonatomic, strong) UILabel *leftLabel;
@property (nonatomic, strong) UILabel *rightLabel;

@end
代码语言:javascript
复制
#pragma mark - Getters and Setters
- (UILabel *)leftLabel {
    if (_leftLabel == nil) {
        _leftLabel = [[UILabel alloc] init];
        _leftLabel.text = @"左边";
        _leftLabel.textColor = [UIColor redColor];
        _leftLabel.backgroundColor = [UIColor lightGrayColor];
    }
    return _leftLabel;
}

- (UILabel *)rightLabel {
    if (_rightLabel == nil) {
        _rightLabel = [[UILabel alloc] init];
        _rightLabel.text = @"右边";
        _rightLabel.textColor = [UIColor blueColor];
        _rightLabel.backgroundColor = [UIColor lightGrayColor];
    }
    return _rightLabel;
}
代码语言:javascript
复制
#pragma mark - Life Cycle
- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self setupUI];
}

#pragma mark - SetupUI
- (void)setupUI {
    
    [self.view addSubview:self.leftLabel];
    [self.view addSubview:self.rightLabel];
    
    [self.leftLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(self.view).offset(16);
        make.top.equalTo(self.view).offset(50);
    }];
    [self.rightLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.right.equalTo(self.view).offset(-16);
        make.centerY.equalTo(self.leftLabel);
    }];
}

<h5>文字内容足够少、居左右两侧显示</h5>

按照上面默认的即可。

<h5>文字内容足够少、但需要一方拉伸</h5>

代码语言:javascript
复制
[self.leftLabel mas_makeConstraints:^(MASConstraintMaker *make) {
    make.left.equalTo(self.view).offset(16);
    make.top.equalTo(self.view).offset(50);
    make.right.equalTo(self.rightLabel.mas_left).offset(-10);
}];
[self.rightLabel mas_makeConstraints:^(MASConstraintMaker *make) {
    make.right.equalTo(self.view).offset(-16);
    make.centerY.equalTo(self.leftLabel);
}];
代码语言:javascript
复制
[self.leftLabel mas_makeConstraints:^(MASConstraintMaker *make) {
    make.left.equalTo(self.view).offset(16);
    make.top.equalTo(self.view).offset(50);
}];
[self.rightLabel mas_makeConstraints:^(MASConstraintMaker *make) {
    make.right.equalTo(self.view).offset(-16);
    make.centerY.equalTo(self.leftLabel);
    make.left.equalTo(self.leftLabel.mas_right).offset(10);
}];

或者按照如下方式设置

代码语言:javascript
复制
/**
 * 设置左侧 Label 不被拉伸(即右边的被拉伸)
 * 默认情况下:HuggingPriority == 250;
 * 就要设置 leftLabel.HuggingPriority > 250
 * 或者     rightLabel.HuggingPriority < 250
 * UILayoutPriorityRequired == 1000;
 * 这里只要是 HuggingPriority > 250 即可,写成 251 也是同样的效果;
 */
[self.leftLabel setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal];
//    UILayoutPriorityFittingSizeLevel == 50;
//    [self.rightLabel setContentHuggingPriority:UILayoutPriorityFittingSizeLevel forAxis:UILayoutConstraintAxisHorizontal];

[self.leftLabel mas_makeConstraints:^(MASConstraintMaker *make) {
    make.left.equalTo(self.view).offset(16);
    make.top.equalTo(self.view).offset(50);
    make.right.equalTo(self.rightLabel.mas_left).offset(-10);
}];
[self.rightLabel mas_makeConstraints:^(MASConstraintMaker *make) {
    make.right.equalTo(self.view).offset(-16);
    make.centerY.equalTo(self.leftLabel);
    make.left.equalTo(self.leftLabel.mas_right).offset(10);
}];

<h5>文字内容足够多、右侧被压缩</h5>

只要设置leftLabelrightrightLabelmas_left间距即可。需要谁不被压缩,就设置谁距离另外一个被压缩的的间距即可。

如果左右相互之间的间距都设置的话,那么默认右侧Label被压缩。

代码语言:javascript
复制
[self.leftLabel mas_makeConstraints:^(MASConstraintMaker *make) {
    make.left.equalTo(self.view).offset(16);
    make.top.equalTo(self.view).offset(50);
    make.right.equalTo(self.rightLabel.mas_left).offset(-10);
}];
[self.rightLabel mas_makeConstraints:^(MASConstraintMaker *make) {
    make.right.equalTo(self.view).offset(-16);
    make.centerY.equalTo(self.leftLabel);
}];

<h5>文字内容足够多、左侧被压缩</h5>

设置rightLabelleftleftLabelmas_right间距即可。需要谁不被压缩,就设置谁距离另外一个被压缩的的间距即可。

代码语言:javascript
复制
[self.leftLabel mas_makeConstraints:^(MASConstraintMaker *make) {
    make.left.equalTo(self.view).offset(16);
    make.top.equalTo(self.view).offset(50);
}];
[self.rightLabel mas_makeConstraints:^(MASConstraintMaker *make) {
    make.right.equalTo(self.view).offset(-16);
    make.centerY.equalTo(self.leftLabel);
    make.left.equalTo(self.leftLabel.mas_right).offset(10);
}];

或者通过ContentCompressionResistancePriority设置

代码语言:javascript
复制
/**
 * 设置右侧 Label 不被压缩(即左侧的被压缩)
 * 默认情况下:ContentCompressionResistancePriority == 750;
 * 就要设置 rightLabel.ContentCompressionResistancePriority > 750
 * 或者     leftLabel.ContentCompressionResistancePriority < 750
 * UILayoutPriorityRequired == 1000;
 * 这里只要是 ContentCompressionResistancePriority > 750 即可,写成 751 也是同样的效果;
 */
[self.rightLabel setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal];
//    UILayoutPriorityDefaultLow == 250;
[self.leftLabel setContentCompressionResistancePriority:UILayoutPriorityDefaultLow forAxis:UILayoutConstraintAxisHorizontal];

[self.leftLabel mas_makeConstraints:^(MASConstraintMaker *make) {
    make.left.equalTo(self.view).offset(16);
    make.top.equalTo(self.view).offset(50);
    make.right.equalTo(self.rightLabel.mas_left).offset(-10);
}];
[self.rightLabel mas_makeConstraints:^(MASConstraintMaker *make) {
    make.right.equalTo(self.view).offset(-16);
    make.centerY.equalTo(self.leftLabel);
    make.left.equalTo(self.leftLabel.mas_right).offset(10);
}];
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.08.05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档