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

iOS 動態調整導航欄標題長度的最佳實踐

     編輯:程式設計綜合問答

在 iOS 應用開發中,導航欄標題過長時預設會以省略號(…)截斷,影響閱讀體驗。本文介紹如何透過自訂 titleView 實現標題自適應寬度,完美解決長標題顯示問題。

核心解決方案:使用 UILabel 作為 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;
}

關鍵屬性詳細說明

  • adjustsFontSizeToFitWidth:設為 YES 時,標籤會自動縮小字體以容納完整文字。
  • minimumScaleFactor:定義最小縮放比例(預設 0),防止字體過小難以閱讀。建議設 0.5~0.7。
  • numberOfLines:若允許換行,可設為 0 並配合 lineBreakMode。
  • frame 寬度:初始寬度建議設為導航欄可用區域寬度(約螢幕寬減左右按鈕空間),過寬會導致標題被按鈕遮擋。

進階技巧:動態計算可用寬度

為了在不同裝置、橫豎向、有無左右按鈕情況下都能完美適配,建議動態計算 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);

常見坑點與解決方案

問題 1:標題仍被截斷或顯示不全

原因:titleView 的 frame 寬度過大,超出導航欄可視區域。解決:動態計算最大寬度,或使用 Auto Layout 约束(iOS 11+ 支援)。

問題 2:字體縮放後過小難以閱讀

解決:設定 minimumScaleFactor,或改用 numberOfLines = 2 允許換行顯示。

問題 3:iOS 11+ 大標題模式下 titleView 行為異常

解決:大標題模式下 titleView 僅在縮小時顯示。若需支援大標題,建議改用 navigationItem.largeTitleDisplayMode 配合自訂視圖。

總結

透過自訂 UILabel 作為 titleView 並啟用 adjustsFontSizeToFitWidth,配合動態寬度計算,即可完美解決導航欄長標題顯示問題。這比截斷、滾動或縮放整個導航欄更優雅、更符合 iOS 設計規範。

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