iOS控件自動適應大小

1、文字控件自適應大小

(一)、實現效果:

左邊控件長度可被擠壓,右邊控件徹底展現。當左邊控件長度過長時,進行擠壓,保證右邊控件能徹底展現。
數組

效果以下圖: less

左邊被擠壓

左邊未擠壓

(二)、實現方式:

(1)、直接計算控件長度

//計算文字寬度
- (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的寬度佈局

//左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進行佈局。ui

(2)、使用約束優先級

(a)、理論

  • 約束優先級
    在Autolayout中每一個約束都有一個優先級, 優先級的範圍是1 ~ 1000。建立一個約束,默認的優先級是最高的1000。
  • Content Hugging Priority
    該優先級表示一個控件抗被拉伸的優先級。優先級越高,越不容易被拉伸,默認是250。
  • Content Compression Resistance Priority
    該優先級和上面那個優先級相對應,表示一個控件抗壓縮的優先級。優先級越高,越不容易被壓縮,默認是750

默認狀況下兩邊的label的Content Hugging和Content Compression優先級都是同樣的,因此不作處理的話,左邊會顯示徹底,而右邊的會被擠壓。spa

爲了讓右邊的label徹底顯示,那麼咱們須要增大右邊label的抗壓縮級,或者減少左邊label的抗壓縮級,總之是得讓右邊的抗壓縮級大於左邊的label,這樣才能讓右邊的label內容優先顯示。code

UIView中關於Content Hugging 和 Content Compression Resistance的方法有:orm

- (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)、代碼

[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)、效果


2、普通控件等間距自適應大小

等間距佈局,寬度自適應

(1)、實現效果

(2)、實現

4個控件,橫向佈局,控件間距30,第一個控件與父容器間距15, 最後一個控件與父容器間距15cdn

//將須要佈局的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);
}];
複製代碼
相關文章
相關標籤/搜索