Demo在本文最后,先來說下在做自定義TabBar時候遇到的問題
1.TabBar設置的背景色與想要的效果不一致,有的項目可能需要解決TabBar上方描邊黑線
2.在popToRoot或者切換TabBar selectIndex時候,原生的UITabBarItem會覆蓋在自定義的TabBar上的問題
3.凸起部分點擊無響應問題
下面依次解決這幾個問題
問題1
設置TabBar背景色后發現如下圖左側,實際想要效果如下圖右側
上網搜用如下代碼可以解決[UITabBar appearance].translucent = NO;不過這樣改變穿透度后在寫頁面布局的時候可能會遇到偏移一個導航高度的問題,我的解決辦法是寫一個view覆蓋在TabBar上,方法有點low不過感覺實用,如果需要解決描邊黑線問題,可以自己寫一條線覆蓋上去
問題2
將系統原生的UITabBarItem去掉,重寫下面幾個方法
- (NSArray<UITabBarItem *> *)items { return @[]; } - (void)setItems:(NSArray<UITabBarItem *> *)items { } - (void)setItems:(NSArray<UITabBarItem *> *)items animated:(BOOL)animated { }
問題3
解決凸起無響應問題重寫如下方法
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { //這一個判斷是關鍵,不判斷的話push到其他頁面,點擊發布按鈕的位置也是會有反應的,這樣就不好了 //self.isHidden == NO 說明當前頁面是有tabbar的,那么肯定是在導航控制器的根控制器頁面 //在導航控制器根控制器頁面,那么我們就需要判斷手指點擊的位置是否在發布按鈕身上 //是的話讓發布按鈕自己處理點擊事件,不是的話讓系統去處理點擊事件就可以了 if (self.isHidden == NO) { //將當前tabbar的觸摸點轉換坐標系,轉換到發布按鈕的身上,生成一個新的點 CGPoint newP = [self convertPoint:point toView:self.centerBtn]; //判斷如果這個新的點是在發布按鈕身上,那么處理點擊事件最合適的view就是發布按鈕 if ( [self.centerBtn pointInside:newP withEvent:event]) { return self.centerBtn; }else{//如果點不在發布按鈕身上,直接讓系統處理就可以了 return [super hitTest:point withEvent:event]; } } else {//tabbar隱藏了,那么說明已經push到其他的頁面了,這個時候還是讓系統去判斷最合適的view處理就好了 return [super hitTest:point withEvent:event]; } }
本文參考資料
https://www.jianshu.com/p/962c14794f5b
https://www.jianshu.com/p/26e946229c9f
https://www.jianshu.com/p/46f61bc7a938
如有問題可以聯系QQ1120051590,一起交流學習