首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

iOS 自定義 TabBar 實戰:繼承 UITabBar 時的子視圖過濾與佈局技巧

     編輯:關於C語言

iOS 自定義 TabBar 實戰:繼承 UITabBar 時的子視圖過濾與佈局技巧

自定義 UITabBar 主要有兩條路徑:繼承 UITabBar 或繼承 UIView 完全自繪。本文聚焦繼承 UITabBar 方案,解決「如何精準調整系統按鈕佈局、插入自定義按鈕」的核心難點。

核心痛點:subviews 遠不止按鈕

直接遍歷 self.subviews 會發現三類視圖:

  • UITabBarButton(私有類):真正的標籤按鈕
  • UITabBarBackgroundView:背景視圖
  • UIImageView:分隔線/陰影等裝飾視圖

直接對所有 subviews 設 frame 會導致背景、分隔線錯位,必須過濾出按鈕。

解決方案:Runtime 類名比對過濾

UITabBarButton 是私有類,無法直接 #import,需用 NSClassFromString 動態獲取:

- (void)layoutSubviews {
    [super layoutSubviews];
    
    Class btnClass = NSClassFromString(@"UITabBarButton");
    for (UIView *child in self.subviews) {
        if ([child isKindOfClass:btnClass]) {
            // 這裡安全調整按鈕 frame、插入自定義按鈕等
            // 例:child.frame = CGRectMake(...);
        }
    }
}

進階佈局策略

  1. 插入中間加號按鈕:在過濾迴圈中計算按鈕數量,中間位置插入自定義 UIButton,並調整左右原生按鈕間距
  2. 動態調整按鈕寬度:根據 self.bounds.width / 按鈕數 重新分佈
  3. 響應選中狀態:監聽 UIControlEventTouchUpInside 切換 selectedImage/title 顏色

避坑指南

  • 不要在 init 佈局:此時 subviews 尚未建立,需在 layoutSubviews 或 setItems: 之後
  • 橫豎屏適配:layoutSubviews 會多次調用,佈局邏輯需冪等
  • iOS 版本差異:iOS 13+ 引入 UITabBarAppearance,背景圖/陰影建議改用 Appearance API,而非直接改 subviews
  • 安全區域:iPhone X 系列需考慮 safeAreaInsets.bottom,避免按鈕被 Home Indicator 遮擋

替代方案對比

方案優點缺點
繼承 UITabBar保留系統動畫、無障礙、外觀代理依賴私有類結構,版本升級風險
繼承 UIView + 隱藏原生 TabBar完全可控、無私有 API 風險需手動實現選中動畫、無障礙、旋轉適配
第三方庫(如 CYLTabBarController)功能豐富、維護良好引入依賴、體積增大

對於「微調按鈕佈局、加個中間按鈕」等輕度需求,繼承 UITabBar + Runtime 過濾是性價比最高的方案;重度定製建議轉向完全自繪或成熟第三方庫。

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