在 iOS 應用開發中,導航欄標題過長時預設會以省略號(…)截斷,影響閱讀體驗。本文介紹如何透過自訂 titleView 實現標題自適應寬度,完美解決長標題顯示問題。
關鍵在於建立一個 UILabel,啟用 adjustsFontSizeToFitWidth 屬性,並將其指派給 navigationItem.titleView。以下是完整實作碼:
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"Your Title Text";
UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 200, 40)];
titleLabel.text = self.navigationItem.title;
titleLabel.textColor = [UIColor whiteColor];
titleLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:30.0];
titleLabel.backgroundColor = [UIColor clearColor];
titleLabel.adjustsFontSizeToFitWidth = YES; // 關鍵屬性:自動縮放字體以適應寬度
titleLabel.minimumScaleFactor = 0.5; // 可選:設定最小縮放比例
titleLabel.textAlignment = NSTextAlignmentCenter;
self.navigationItem.titleView = titleLabel;
}
YES 時,標籤會自動縮小字體以容納完整文字。lineBreakMode。為了在不同裝置、橫豎向、有無左右按鈕情況下都能完美適配,建議動態計算 titleView 最大寬度:
CGFloat maxWidth = self.view.frame.size.width - 120; // 預留左右各 60pt 給按鈕
if (self.navigationItem.leftBarButtonItems.count > 0) {
maxWidth -= 60; // 根據實際按鈕寬度調整
}
if (self.navigationItem.rightBarButtonItems.count > 0) {
maxWidth -= 60;
}
titleLabel.frame = CGRectMake(0, 0, maxWidth, 44);
原因:titleView 的 frame 寬度過大,超出導航欄可視區域。解決:動態計算最大寬度,或使用 Auto Layout 约束(iOS 11+ 支援)。
解決:設定 minimumScaleFactor,或改用 numberOfLines = 2 允許換行顯示。
解決:大標題模式下 titleView 僅在縮小時顯示。若需支援大標題,建議改用 navigationItem.largeTitleDisplayMode 配合自訂視圖。
透過自訂 UILabel 作為 titleView 並啟用 adjustsFontSizeToFitWidth,配合動態寬度計算,即可完美解決導航欄長標題顯示問題。這比截斷、滾動或縮放整個導航欄更優雅、更符合 iOS 設計規範。