天天看點

UILabel (UITableViewCell的動态高度)

原文: http://hi.baidu.com/redefine/blog/item/1bad04c3291b4c39e4dd3be1.html

做一個普通iPhone程式,以一個twitter用戶端為例,最花時間的UI部分可能就是UITableView了,而其中最重要的部分是則是UITableViewCell。

以UITableViewCellStyleValue2為例,可以用左側的Label來顯示使用者名,右側的Label顯示推的内容。那麼接下來要處理的問題就是怎麼樣來控制單元格高度來完美顯示長度不同的推。

左側的Label叫做textLabel,隻要簡單的用一個語句加載使用者名即可:

cell.textLabel.text = @"ztpala";

右側的Label為detailTextLabel:

cell.detailTextLabel.text = @"這是一條很長很長很長很長很長很長很長的推"

如果僅使用這兩條語句,顯示結果就會是下面那樣:

???? ztpala 這是一條很長很長很...

如果要顯示完整的推,關鍵部分有兩個:

1. 讓detailTextLabel可以合适的換行

2. 調整單元格的大小進而可以完全顯示detailTextLabel

cell.detailTextLabel.lineBreakMode = UILineBreakModeWordWrap; //如何換行

cell.detailTextLabel.numberOfLines = 0; //這個值設定為0可以讓UILabel動态的顯示需要的行數。

調整單元格的高度則比較複雜,需要小心計算,步驟如下:

1. 首先要确定一條消息所占的寬度,這個一般都是固定的,然後根據這個寬度來計算一段文字在這個寬度,某個字型下需要多少高度

UIFont *font = [UIFont systemFontOfSize:17.0] //先确定使用的字型,因為字型不同占用的空間也不相同

//假設someString代表消息,labelWidth代表某個固定寬度, 1000是個虛數隻是為了創造一個能完全放下這些文字的空間

CGSize size = [someString sizeWithFont:font constrainedToSize:CGSizeMake(labelWidth, 1000) lineBreakMode:UILineBreakModeWordWrap];

//size即傳回的完全顯示消息實際需要的空間

2. 确定單元格高度。最關鍵的長度不一的消息所需的高度已經确定,下面隻要加上上所需固定空間即可以确定單元格高度,完整代碼

- (CGFloat)tableView:(UITableView *)atableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 

{     

UIFont *font = [UIFont systemFontOfSize:17.0]

CGSize size = [someString sizeWithFont:font constrainedToSize:CGSizeMake(labelWidth, 1000) lineBreakMode:UILineBreakModeWordWrap];

return size.height+10; // 10即消息上下的空間,可自由調整

}
           

總體來說很簡單,但當你需要自己格式化單元格顯示的時候,整個處理還是比較繁雜。

繼續閱讀