在 iOS 開發中,主容器為 UITabBarController,底下掛載四個子介面,每個子介面皆獨立擁有一個 UINavigationController。專案原本運作正常,但在導入舊有業務代碼後,出現一個極為詭異的現象:
navigationBar 的設置(如背景顏色)全部失效,導航欄顯示為預設的半透明灰色。navigationBar 座標為基準的視圖佈局,整體向下偏移了一個導航欄的高度(44pt)。然而,在真機運行時卻完全正常,顏色與佈局均無異常。
[self.navigationController.navigationBar setBarTintColor:[UIColor colorWithRed:0.164 green:0.657 blue:0.915 alpha:1.000]];
npiBtn.frame = CGRectMake(20.f,
self.navigationController.navigationBar.frame.origin.y +
self.navigationController.navigationBar.frame.size.height + 10,
(screenn.size.width - 40 - 10) / 2, 90.f);
這是典型的 iOS 7/8 版本差異 導致的問題。iOS 7 起 UINavigationBar 預設為半透明(translucent = YES),視圖控制器的 edgesForExtendedLayout 預設為 UIRectEdgeAll,導致視圖會延伸到導航欄下方。模擬器與真機的運行環境(如 iOS 版本、編譯架構)可能不同,導致佈局邏輯表現不一致。
self.navigationController.navigationBar.translucent = NO;
self.edgesForExtendedLayout = UIRectEdgeNone;
barTintColor 而非 tintColor,並確保在 viewDidLoad 或 viewWillAppear: 中設置。更多關於 iOS 7/8 導航欄坑的詳細說明,可參考:iOS7及以上版本navigationBar帶來的坑
模擬器與真機表現不一致時,優先檢查 translucent、edgesForExtendedLayout 以及 iOS 版本適配代碼。統一在真機測試為準,模擬器僅作輔助驗證。