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

iOS UINavigationBar 標題長文本自適應:adjustsFontSizeToFitWidth 解決截斷

     編輯:程式設計綜合問答

問題

導航欄標題過長被截斷 (顯示「...」),設置 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 (不可太小影響閱讀)
minimumFontSizeiOS 6- 棄用,改用 minimumScaleFactor勿用
numberOfLines行數,自適應需為 11
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);
    }
}

Swift 版本


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 寬度可獲得更好效果。

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