之前曾整理過兩篇自定義TabBar的文章:
自定義TabBar01
自定義TabBar02
這里先將以前的兩種實現方式思路剪短的描述一下,接下來再補充另外一種簡便的方式,并強調一下注意點:
- 在
自定義TabBar01
中,完全采用了自定義控件的方式覆蓋到原有TabBarController的,通過代理的方式監聽每一個自定義按鈕的點擊,獲取到一個Tag值,在TabBarController中通過其selectedIndex
屬性來手動切換控制器選中 - 在
自定義TabBar02
中,使用UITabBarController時,都需要設置其子控制器,在原有TabBar基礎上只是增加了一個自定義Button,并在LayoutSubView
方法中,遍歷subViews
重新設置Frame,最后通過代理監聽自定義按鈕的點擊
接下來介紹一種更為簡單的方式:
1.在給TabBarController添加子控制器時,在需要的位置上加入一個占位的UIViewController控制器
2.在占位控制器所在位置的TarBar處,加上一個自定義Button,可以手動設置其Frame,也可以通過CGRectInset(<#CGRect rect#>, <#CGFloat dx#>, <#CGFloat dy#>)
方法設置其X坐標的縮放距離
e.g. 自定義button.frame = CGRectInset(self.tabBar.bounds, i*ItemWidth, 0)
3.通過前兩步基本已經實現自定義TabBar的效果,但是有一個細節需要考慮,每個TabBarItem間都會有大概一個點距離的容錯點,當使用手指時可能不太容易觸及,但在使用模擬器時,比較容易復現出這個Bug,在自定義Button兩側點著點著,就容易把占位控制器的界面點出來,所以當我們使用上面縮放的方式來設置buttonframe時,可以讓其少縮放一些,來遮擋住兩側的容錯點(就相當于讓自定義Button的寬度稍微變大一點點)
e.g. 自定義button.frame = CGRectInset(self.tabBar.bounds, i*(ItemWidth-1), 0)
區別:
1.自定義TabBar01
自定義程度最高,代碼實現相對復雜一點
2.自定義TabBar02
自定義程序適中,代碼量比前一種明顯減少
3.自定義TabBar03
自定義程序最低,只是加了一個Button,而且免去了代理/block等回調,直接addTarget即可,代碼量最少,但是需要注意第3點的細節
通過更改自定義Button.frame的方式解決穿幫的問題不是十分嚴謹,有些取巧
我們還可以通過UITabBarControllerDelegate中的代理方法來妥善解決這個Bug
說明:
首先通常情況下,我們使用TabBarController的時候,根控制器一般都是使用UINavigationController,我們可以借助控制器類型進行判斷,在將要點擊TabBar的時候,是否進一步選中對應的控制器,示例代碼:
#pragma mark
#pragma mark - UITabBarControllerDelegate
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController NS_AVAILABLE_IOS(3_0) {
if ([viewController isKindOfClass:[XXXController class]] ) {
return NO;
}
return YES;
}