自定義TabBar03

之前曾整理過兩篇自定義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;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,252評論 4 61
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,991評論 19 139
  • 這本書分為兩個部分看的——前期因為看了之后特別壓抑,遂而中斷,中間回了趟老家,回來又繼續看才勉強看完。 對阿富汗的...
    站直慢慢走閱讀 1,096評論 2 1
  • 首先我不是因為想著掙錢而被騙,而是被朋友以畫墻繪和游玩的名義騙到西安。因為西安是我一直向往的地方,所以朋友說他去西...
    圣茜兒閱讀 176評論 0 0
  • 前端狀態管理請三思 在這篇文章中提到了前端狀態管理的一種思路,也就是使用有限狀態自動機來管理前端狀態。初讀時我沒有...
    wlszouc閱讀 1,590評論 0 0