本文最后更新于:2021年12月22日 中午
                
              
            
            
              
一、文字控件自适应大小
(一)、实现效果:
左边控件长度可被挤压,右边控件完全展示。当左边控件长度过长时,进行挤压,保证右边控件能完全展示。
效果如下图:


(二)、实现方式:
(1)、直接计算控件长度
| 12
 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的宽度
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 
 | CGFloat longWidth = [self textWidthFromTitle:titleArray[0] fontSize:15];
 
 
 CGFloat normalWidth = [self textWidthFromTitle:titleArray[1] fontSize:15];
 
 
 CGFloat shortWidth = [self textWidthFromTitle:titleArray[2] fontSize:15];
 
 
 CGFloat screenWidth = [UIScreen mainScreen].bounds.size.width;
 
 
 CGFloat longRealWdith = MIN(longWidth, (screenWidth - normalWidth - shortWidth - 10 * 4));
 
 | 
使用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的方法有:
| 12
 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)、代码
| 12
 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);
 }];
 
 
 
 [self.leftLB1 setContentCompressionResistancePriority:UILayoutPriorityDefaultLow forAxis:UILayoutConstraintAxisHorizontal];
 
 
 
 
 
 
 
 
 | 
(c)、效果

二、普通控件等间距自适应大小
等间距布局,宽度自适应
(1)、实现效果

(2)、实现
4个控件,横向布局,控件间距30,第一个控件与父容器间距15,
 最后一个控件与父容器间距15
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 
 | NSArray *array = @[v1,v2,v3,v4];
 
 
 
 
 
 [array mas_distributeViewsAlongAxis:MASAxisTypeHorizontal
 withFixedSpacing:30 leadSpacing:15 tailSpacing:15];
 
 
 [array mas_makeConstraints:^(MASConstraintMaker *make) {
 make.centerY.equalTo(self.bgView);
 make.height.equalTo(@100);
 }];
 
 | 
联系方式
邮箱: xiebangyao_1994@163.com
相关账号: