【iOS笔记】【11】iOS控件自适应大小

本文最后更新于:2021年12月22日 中午

【主页】系列文章目录

【iOS笔记】系列目录


一、文字控件自适应大小

(一)、实现效果:

左边控件长度可被挤压,右边控件完全展示。当左边控件长度过长时,进行挤压,保证右边控件能完全展示。

效果如下图:
左边被挤压

左边未挤压

(二)、实现方式:

(1)、直接计算控件长度

1
2
3
4
5
6
7
//计算文字宽度
- (CGFloat)textWidthFromTitle:(NSString *)title fontSize:(CGFloat)fontSize{
CGSize constrainedSize = CGSizeMake(0, MAXFLOAT);
CGRect textRect = [title boundingRectWithSize:constrainedSize options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:fontSize]} context:nil];
return textRect.size.width + 1; //在label中能显示全
}

计算每一个Label的宽度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//左Lable宽度
CGFloat longWidth = [self textWidthFromTitle:titleArray[0] fontSize:15];

//中间Lable宽度
CGFloat normalWidth = [self textWidthFromTitle:titleArray[1] fontSize:15];

//右Lable宽度
CGFloat shortWidth = [self textWidthFromTitle:titleArray[2] fontSize:15];

//屏幕宽度
CGFloat screenWidth = [UIScreen mainScreen].bounds.size.width;

//计算左Label真实宽度
CGFloat longRealWdith = MIN(longWidth, (screenWidth - normalWidth - shortWidth - 10 * 4)); //间距为10

使用frame或者Masonry进行布局。

(2)、使用约束优先级

(a)、理论

  • 约束优先级
    在Autolayout中每个约束都有一个优先级, 优先级的范围是1 ~ 1000。创建一个约束,默认的优先级是最高的1000。
  • Content Hugging Priority
    该优先级表示一个控件抗被拉伸的优先级。优先级越高,越不容易被拉伸,默认是250。
  • Content Compression Resistance Priority
    该优先级和上面那个优先级相对应,表示一个控件抗压缩的优先级。优先级越高,越不容易被压缩,默认是750

默认情况下两边的label的Content Hugging和Content Compression优先级都是一样的,所以不做处理的话,左边会显示完全,而右边的会被挤压。

为了让右边的label完全显示,那么我们需要增大右边label的抗压缩级,或者减小左边label的抗压缩级,总之是得让右边的抗压缩级大于左边的label,这样才能让右边的label内容优先显示。

UIView中关于Content Hugging 和 Content Compression Resistance的方法有:

1
2
3
4
5
- (UILayoutPriority)contentHuggingPriorityForAxis:(UILayoutConstraintAxis)axis NS_AVAILABLE_IOS(6_0);
- (void)setContentHuggingPriority:(UILayoutPriority)priority forAxis:(UILayoutConstraintAxis)axis NS_AVAILABLE_IOS(6_0);

- (UILayoutPriority)contentCompressionResistancePriorityForAxis:(UILayoutConstraintAxis)axis NS_AVAILABLE_IOS(6_0);
- (void)setContentCompressionResistancePriority:(UILayoutPriority)priority forAxis:(UILayoutConstraintAxis)axis NS_AVAILABLE_IOS(6_0);

(b)、代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
[self.leftLB mas_makeConstraints:^(MASConstraintMaker *make) {
make.height.equalTo(@(30));
make.left.equalTo(self.bgView).offset(10);
make.centerY.equalTo(self.bgView).offset(-50);
make.right.mas_lessThanOrEqualTo(self.rightLB.mas_left);
}];

[self.rightLB mas_makeConstraints:^(MASConstraintMaker *make) {
make.height.equalTo(@(30));
make.left.mas_greaterThanOrEqualTo(self.leftLB.mas_right);
make.right.equalTo(self.bgView).offset(-10);
make.centerY.equalTo(self.leftLB);
}];

[self.leftLB1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.height.equalTo(@(30));
make.left.equalTo(self.bgView).offset(10);
make.centerY.equalTo(self.bgView).offset(50);
make.right.mas_lessThanOrEqualTo(self.rightLB1.mas_left);
}];

[self.rightLB1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.height.equalTo(@(30));
make.left.mas_greaterThanOrEqualTo(self.leftLB1.mas_right);
make.right.equalTo(self.bgView).offset(-10);
make.centerY.equalTo(self.leftLB1);
}];

//下面四行代码四选一即可
//让左边的label抗压缩性降低,即可压缩,越高越不容易被压缩
[self.leftLB1 setContentCompressionResistancePriority:UILayoutPriorityDefaultLow forAxis:UILayoutConstraintAxisHorizontal];

//或者让左边的label抗拉伸性增高,越高越不容易被拉伸
// [self.leftLB1 setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal];
//或者让右边的label抗压缩性增高,即可扩张
// [self.rightLB1 setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal];
//或者让右边的label抗拉伸性降低,即可扩张
// [self.rightLB1 setContentHuggingPriority:UILayoutPriorityDefaultLow forAxis:UILayoutConstraintAxisHorizontal];

(c)、效果


二、普通控件等间距自适应大小

等间距布局,宽度自适应

(1)、实现效果

(2)、实现

4个控件,横向布局,控件间距30,第一个控件与父容器间距15,
最后一个控件与父容器间距15

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//将需要布局的view加入一个数组中
NSArray *array = @[v1,v2,v3,v4];

/*
使用方法,一次性配置:横向布局,控件间距30,第一个控件与父容器间距15,
最后一个控件与父容器间距15,将MASAxisTypeHorizontal换成MASAxisTypeVertical则是纵向布局
*/
[array mas_distributeViewsAlongAxis:MASAxisTypeHorizontal
withFixedSpacing:30 leadSpacing:15 tailSpacing:15];

//给数组中每个view设置约束,在父view的与需要平分的方向的垂直方向的位置,例如需要在水平方向平分,就给一个竖直方向的位置
[array mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(self.bgView);
make.height.equalTo(@100);
}];

联系方式

邮箱: xiebangyao_1994@163.com

相关账号: