要讓 UILabel 在父視圖完美居中,且寬高隨文本內容自適應,核心步驟是:先計算文本尺寸,再設置 Label 的 frame,最後將 center 設為父視圖的 center。
NSString *text = @"動態文本內容...";
UIFont *font = [UIFont systemFontOfSize:15];
CGFloat maxWidth = 300; // 限制最大寬度,高度不限
// 計算文本實際佔用尺寸
CGSize textSize = [text boundingRectWithSize:CGSizeMake(maxWidth, CGFLOAT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
attributes:@{NSFontAttributeName: font}
context:nil].size;
// 創建 Label 並設置 frame
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, ceil(textSize.width), ceil(textSize.height))];
label.text = text;
label.font = font;
label.numberOfLines = 0;
label.textAlignment = NSTextAlignmentCenter;
// 關鍵:設置 center 實現絕對居中
label.center = self.view.center;
[self.view addSubview:label];
boundingRectWithSize 的 width 傳具體值(如 300),height 傳 CGFLOAT_MAX 表示不限制高度。ceil() 避免子像素導致模糊。self.view.center 同時實現水平垂直居中,無需手動計算 x/y。numberOfLines = 0 必須設置。若使用約束,只需:
label.translatesAutoresizingMaskIntoConstraints = false;
[NSLayoutConstraint activateConstraints:@[
label.centerXAnchor.constraintEqualToAnchor(self.view.centerXAnchor),
label.centerYAnchor.constraintEqualToAnchor(self.view.centerYAnchor),
label.widthAnchor.constraintLessThanOrEqualToConstant(300)
]];
label.text = text; // 內容變化自動更新佈局
Frame 佈局適合簡單場景,Auto Layout 更利於維護與適配。