iOS AutoLayout進階(四)Content Hugging Priority和Content Compression Resist綜合運用

weixin_33935777發表於2017-12-14

前言

前面兩個章節給大家詳細介紹了Content Hugging Priority(抗拉伸優先順序)和Content Compression Resistance Priority(抗壓縮優先順序), 本文將綜合運用這兩個屬性,來處理一個專案中的實際需求.

一. 要點回顧:

1.Content Hugging Priority

檢視抗拉伸優先順序, 值越小,檢視越容易被拉伸,

2. Content Compression Resistance Priority:

檢視抗壓縮優先順序, 值越小,檢視越容易被壓縮,

二.實際運用

我先來看下下面這個效果,在不計算文字寬度和不修改約束的前提下,怎麼通過設定Content Hugging Priority和Content Compression Resistance Priority屬性來實現:

效果描述:

  • 這個是社群評論頁面裡,使用者資訊的一部分
  • 最左邊是:使用者影象
  • 黃色Label:使用者暱稱(暱稱長度不確定)
  • 藍色Label:評論發表時間(時間長度不確定)

兩點要求:

  • 1.黃色abel(顯示暱稱),其寬度由使用者暱稱長度決定, 藍色label(顯示時間),其寬度由時間長度決定,
  • 2.當使用者暱稱長度變長時,藍色label自動右移,移到螢幕邊緣時,使用者暱稱繼續增加,暱稱將縮略顯示 3.當使用者暱稱變短時,藍色label自動左移.

三.程式碼示例

新建工程,在頁面新增一個view,並新增約束固定位置和大小, 在這個view上新增三個檢視,分別為:

1.imageView,用來顯示使用者影象 2.黃色label,用來顯示使用者暱稱 3.藍色label,用來顯示時間

並新增如下約束:

imageView:上0,左0,下0,長寬比1:1
黃色label:上0,左0,下0,
藍色label:上0,左0,下0,右0

黃色label和藍色label都不新增寬度約束,其寬度有文字長度決定
複製程式碼

新增完約束後,會報下面錯誤:

此錯誤的意思是:

  • 黃色label,和藍色label都是動態寬度(沒新增寬度約束),
  • 當二者寬度之和,大於右側區域總寬度時,AutoLayout不知道先壓縮哪個label,
  • 當二者寬度之和,小於右側區域總寬度時,AutoLayout不知道先拉伸哪個label,
  • 讓我們為二者新增Content Hugging Priority和Content Compression Resistance Priority約束,

下面來新增這兩個約束:

  • 1.很顯然,當使用者暱稱過長時,我們希望過長的部分省略顯示(即暱稱過長時,黃色label優先被壓縮,其橫向抗壓縮優先順序要低)
  • 2.當使用者暱稱太短時,我們希望藍色label向左側靠過來.(即暱稱太短時,藍色label向左靠,要被拉長,其橫向抗拉伸優先順序要低)

下面我們來為黃色label的Content Compression Resistance Priority(抗壓縮優先順序)橫向優先順序為749,如下:

修改藍色label的Content Hugging Priority(抗拉伸優先順序)橫向優先順序為250,如下:

新增完畢後,我們右鍵拖線兩個label生成變數, 並起一個定時器, 依次設定黃色label文字為:

長暱稱這是一個很長的暱稱
長暱稱這是一個很長的暱
長暱稱這是一個很長的
長暱稱這是一個很長
長暱稱這是一個很
長暱稱這是一個
長暱稱這是一
長暱稱這是
長暱稱這
長暱稱
長暱稱這
長暱稱這是
長暱稱這是一
長暱稱這是一個
長暱稱這是一個很
長暱稱這是一個很長
長暱稱這是一個很長的
長暱稱這是一個很長的暱
長暱稱這是一個很長的暱稱
複製程式碼

不需要計算文字寬度,不需要修改約束,就達到上圖效果.

程式碼如下:


#import "ViewController.h"

static NSString *const NameText = @"長暱稱這是一個很長的暱稱";
static NSInteger changeLength = -1;//記錄單次變化長度

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *nameLab;
@property (weak, nonatomic) IBOutlet UILabel *timeLab;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    _nameLab.text = NameText;//初始值
    _timeLab.text = @"一週以前";//初始值

    [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(action) userInfo:nil repeats:YES];
}

-(void)action{
     /** 當前暱稱 */
    NSString *name = [NameText substringToIndex:_nameLab.text.length+changeLength];
    NSLog(@"當前暱稱:\n%@",name);
    
    _nameLab.text = name;//設定暱稱
    
    if(_nameLab.text.length<=3){//最小寬度
        changeLength = 1;//加長
    }else if(_nameLab.text.length==NameText.length){//最大寬度
        changeLength = -1;//減短
    }
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

複製程式碼

三.小結:

Content Hugging Priority 檢視抗拉伸優先順序 值越小,越先被拉伸

Content Compression Resistance 抗壓縮優先順序 值越小,越先被壓縮,

這兩個屬性,在UITableViewCell 自動高度上有著廣泛運用,下一章節將重點來講,複雜TableViewCell,在不計運算元文字高度情況下,不用第三方TableViewCell自動計算高度框架情況下,怎麼實現自動高度.


程式碼地址:github.com/CoderZhuXH/…

相關文章