IOS 實現動態分配tablecell高度

也許你會遇到這樣一個問題,或者需要這麼一個功能。
表中每個單元格的高度隨着該單元格的內容多少而變化。尤其內容不止是文字的時候

其實要實現這個功能很簡單。
首先所謂的動態分配單元格高度只是效果上看起來是這樣,其實還是跟我們平常設置
單元格高度一樣,每行先分配高度。
這裏就一個demo來說說吧

要實現這個功能其實最重要的就是下面的兩個方法

1、//設置行高
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *text = .......;
//這裏的text具體內容就是你要在單元格上顯示的內容

    CGSize constraint = CGSizeMake(300, 2000.f);
    //先設置一個約束,這個是爲了在寬度一定的時候計算text內容所佔視圖的大小
    //高度儘量設的大一下,因爲你不確定text具體內容有多少
    
    CGSize  size= [text sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:constraint lineBreakMode:NSLineBreakByClipping];
   //這裏利用NSString的一個方法來計算text所佔大小,
   //感謝NSString爲我們封裝了這個方法,使得這個功能得以實現
   
    CGFloat height = MAX(size.height,40.0f);

    //這裏是爲了給單元格高度設置一個最低限度


    return  height;

}


2、//配置每個單元
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UILabel *textLabel = nil;
    //先創建一個用於顯示文字的label,當然也可以用其他的,
   static  NSString *cellIndentifier = @"indentifier";
    //爲單元格創建一個專屬標籤
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIndentifier];
    //先搜索緩衝區看有沒有專屬標籤的cell
    
    if (cell == nil) {
       //如果沒有那麼就創建一個
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIndentifier];
        
        //把標籤初始化
        textLabel = [[UILabel alloc]initWithFrame:CGRectZero];
        textLabel.font = [UIFont systemFontOfSize:14];
        textLabel.tag = 1;
        //這裏設置tag值以便以後調用
        
        //將label添加到cell
        [[cell contentView]addSubview:textLabel];

    }
    
    NSString *text = ......;
    //同上面的
    CGSize constraint = CGSizeMake(300, 2000.f);
    CGSize  size= [text sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:constraint lineBreakMode:NSLineBreakByClipping];
   
    if (!textLabel) {
        textLabel = (UILabel *)[cell viewWithTag:1];
    }

    //如果label是空的那就通過tag值調用


    textLabel.text = text;
    textLabel.frame = CGRectMake(10, 10, 300, size.height);
    //通過text內容所佔size的設置label所顯示在的區域
    
    return cell;
    
}


功能核心也就是以上兩個方法,是不是很簡單?當然這只是純文字,要是還混合有圖片呢?
其實原理是一樣的,UIImage 也有個屬性 size ,說了這個你應該就知道該怎麼辦了吧?
好了就到這裏,後面附上我做的一個關於圖片的demo,若是還不懂可以跟我討論一下。

這是這個demo的截圖,可以看一下效果

             

這個demo的鏈接:http://download.csdn.net/detail/u012884714/6795293


自己遇到了這個問題,然後查資料實現了這個功能,在這裏跟大家分享了 —— LC




發佈了56 篇原創文章 · 獲贊 4 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章