導航欄標題過長被截斷 (顯示「...」),設置 minimumScaleFactor / minimumFontSize 無效。
直接賦值 navigationItem.title 字符串時,系統內部創建的 UILabel **不支援縮放**。需自定義 titleView 為 UILabel 並啟用縮放屬性。
- (void)viewDidLoad {
[super viewDidLoad];
UILabel *titleLabel = [[UILabel alloc] init];
titleLabel.font = [UIFont boldSystemFontOfSize:17.0]; // 標準導航標題字體
titleLabel.text = @"這是一個非常長的導航欄標題需要自動縮放顯示";
titleLabel.textColor = [UIColor whiteColor];
titleLabel.textAlignment = NSTextAlignmentCenter;
titleLabel.backgroundColor = [UIColor clearColor];
// 關鍵屬性:啟用字體自適應寬度
titleLabel.adjustsFontSizeToFitWidth = YES; // 必須設置
titleLabel.minimumScaleFactor = 0.5; // 最小縮放到 50% (字體 8.5pt)
titleLabel.numberOfLines = 1; // 單行
titleLabel.lineBreakMode = NSLineBreakByTruncatingTail; // 截斷模式 (配合縮放)
// 設置寬度約束 (可選,否則自適應內容寬度)
titleLabel.frame = CGRectMake(0, 0, 200, 44); // 建議給定最大寬度
self.navigationItem.titleView = titleLabel;
}
| 屬性 | 作用 | 建議值 |
|---|---|---|
adjustsFontSizeToFitWidth | **核心開關**,內容超寬時自動縮小字體 | YES |
minimumScaleFactor | 最小縮放比例 (相對原字體) | 0.5 ~ 0.7 (不可太小影響閱讀) |
minimumFontSize | iOS 6- 棄用,改用 minimumScaleFactor | 勿用 |
numberOfLines | 行數,自適應需為 1 | 1 |
lineBreakMode | 斷行模式 | NSLineBreakByTruncatingTail (配合縮放) |
導航欄左右可能有按鈕,標題可用寬度動態變化:
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
if (self.navigationItem.titleView) {
// 獲取導航欄實際可用寬度 (扣除左右按鈕)
CGFloat maxWidth = self.navigationController.navigationBar.frame.size.width - 120; // 經驗值
self.navigationItem.titleView.frame = CGRectMake(0, 0, maxWidth, 44);
}
}
let titleLabel = UILabel()
titleLabel.font = .boldSystemFont(ofSize: 17)
titleLabel.text = "很長的標題..."
titleLabel.textColor = .white
titleLabel.textAlignment = .center
titleLabel.adjustsFontSizeToFitWidth = true
titleLabel.minimumScaleFactor = 0.5
titleLabel.numberOfLines = 1
navigationItem.titleView = titleLabel
**自定義 UILabel 作為 titleView,設置 adjustsFontSizeToFitWidth = YES 和 minimumScaleFactor**,即可實現導航標題長文本自動縮放顯示,避免截斷。給定合理的 frame 寬度可獲得更好效果。