在iOS開發中,根據多行文本動態調整UILabel高度是常見需求。關鍵在於先設置文本、字體、寬度約束,再調用size計算方法,否則易得到錯誤高度。
NSString *mytitleString = [discussionData valueForKey:@"Name"];
CGSize size = [mytitleString sizeWithFont:[UIFont systemFontOfSize:14.0]
constrainedToSize:CGSizeMake(500, CGFLOAT_MAX)];
float lbltitleheight = size.height; // 可能不準確
lbltitle.text = mytitleString; // 文本設置在計算之後
問題:sizeWithFont:constrainedToSize:基於字符串屬性計算,但若Label已有約束(如行數numberOfLines=0、行間距、斷行模式),直接用字符串計算會忽略這些屬性,導致高度偏差。
// 1. 先完整配置Label屬性
lbltitle.text = mytitleString; // 先設置文本
lbltitle.font = [UIFont systemFontOfSize:14.0];
lbltitle.numberOfLines = 0; // 關鍵:0表示不限行數
lbltitle.lineBreakMode = NSLineBreakByWordWrapping;
// 2. 使用Label實例方法計算(自動考慮所有屬性)
CGSize maxSize = CGSizeMake(500, CGFLOAT_MAX);
CGSize requiredSize = [lbltitle sizeThatFits:maxSize];
// 3. 更新Frame或約束
CGRect newFrame = lbltitle.frame;
newFrame.size.height = requiredSize.height;
lbltitle.frame = newFrame;
// 若使用Auto Layout:lbltitle.preferredMaxLayoutWidth = 500; 即可自動佈局
CGSize size = [lbltitle.text sizeWithFont:lbltitle.font
constrainedToSize:maxSize
lineBreakMode:lbltitle.lineBreakMode];
注意傳入lineBreakMode參數以匹配Label設置。
Lines = 0、添加Leading/Trailing/Top/Bottom約束。label.text = longText; label.preferredMaxLayoutWidth = containerWidth;。intrinsicContentSize),驅動佈局引擎調整高度,無需手動frame。numberOfLines = 0,默認為1行,超出部分被截斷導致高度錯誤。viewDidLoad中計算高度時View尚未佈局完成,寬度不準。應在viewDidLayoutSubviews或使用Auto Layout。AttributedText時,必須用boundingRectWithSize:options:context:計算。