需動態創建多個 UILabel,每個標籤行數不一(1-4 行),要求按順序垂直排列,間距固定 25pt。關鍵在於準確計算每個 Label 的高度,作為下一個 Label 的 Y 坐標基準。
NSString *text = @"長文本內容...";
UIFont *font = [UIFont systemFontOfSize:16];
CGFloat maxWidth = 300; // Label 最大寬度
CGSize maxSize = CGSizeMake(maxWidth, CGFLOAT_MAX);
// 使用 boundingRectWithString 計算實際佔用尺寸
CGRect textRect = [text boundingRectWithSize:maxSize
options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
attributes:@{NSFontAttributeName: font}
context:nil];
CGFloat labelHeight = ceil(textRect.size.height);
CGFloat currentY = 100; // 起始 Y
CGFloat spacing = 25;
NSArray *texts = @[@"短文本", @"中等長度的文本內容...", @"非常長的多行文本..."];
for (NSString *text in texts) {
UILabel *label = [[UILabel alloc] init];
label.font = [UIFont systemFontOfSize:16];
label.numberOfLines = 0;
label.text = text;
// 計算高度
CGSize size = [text boundingRectWithSize:CGSizeMake(300, CGFLOAT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
attributes:@{NSFontAttributeName: label.font}
context:nil].size;
label.frame = CGRectMake(10, currentY, 300, ceil(size.height));
[self.view addSubview:label];
currentY += label.frame.size.height + spacing; // 更新下一個 Label 的 Y
}
numberOfLines = 0 允許換行。boundingRectWithString 而非舊版 sizeWithFont(已棄用)。frame.origin.y。contentSize。此法可完美適配任意長度文本,實現流式垂直排版。