在 iOS 開發中,自定義 TabBar 主要有兩種途徑:一種是繼承系統的 UITabBar,另一種是繼承 UIView 完全自行繪製。本文將深入探討繼承 UITabBar 時需要注意的關鍵細節,幫助開發者避開常見陷阱。
繼承 UITabBar 的初衷通常是為了調整子控件的 frame、添加額外的子控件(如中間的加號按鈕)或自定義外觀。然而,UITabBar 內部結構較為複雜,包含私有類 UITabBarButton,直接操作子視圖容易誤傷系統自帶的背景視圖或分隔線。
首先,我們可以通過打印 UITabBar 的 subviews 來觀察其內部結構:
for (UIView *child in self.subviews) {
NSLog(@"%@", [child class]);
}
輸出結果顯示,除了我們關心的 UITabBarButton 外,還存在 UITabBarBackgroundView 和 UIImageView(分隔線)兩個系統控件。若直接遍歷修改 frame,這兩個控件會干擾佈局。
由於 UITabBarButton 是私有類,無法直接引用其頭文件。我們可以利用 NSClassFromString 動態獲取類對象進行判斷:
for (UIView *child in self.subviews) {
Class tabBarButtonClass = NSClassFromString(@"UITabBarButton");
if ([child isKindOfClass:tabBarButtonClass]) {
// 僅對 UITabBarButton 進行 frame 設置或佈局調整
// child.frame = ...;
}
}
這樣即可精準定位到每個標籤頁對應的按鈕視圖,避免影響背景視圖與分隔線,實現穩健的自定義佈局。
繼承 UITabBar 時,核心在於「識別目標控件、排除干擾視圖」。採用字符串反射類名的方式雖非最佳實踐(涉及私有 API 風險),但在不破壞封裝、僅調整佈局的場景下,是相對安全且高效的折中方案。若需高度自定義外觀,建議改用繼承 UIView 的完全自定義方案。