首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS 動態添加多行 UILabel:根據內容自適應高度並垂直排版

     編輯:程式設計綜合問答

需動態創建多個 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(已棄用)。
  • 累加高度+間距作為下一個 Label 的 frame.origin.y。
  • 若在 ScrollView 中,別忘記更新 contentSize。

此法可完美適配任意長度文本,實現流式垂直排版。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved