UITabBarController、TabBar背景顏色設定、TabBarItem顏色處理

weixin_34357887發表於2017-11-24

在iOS的開發過程中我們使用最多的框架結構估計就是UITabBarController + UINavigationController架構了,然而在開發過程中,對於許多初學者,甚至對於許多有半年多開發經驗的iOS dev來說還是會有很多很棘手的問題,比如設定tabBar的背景顏色、tabBarItem的圖示選中時的顏色為藍色、tabBarItem選中的背景色的設定... 完整程式碼請關注微信公眾號後輸入 001 獲取。

下面建立專案並搭建UITabBarController + UINavigationController架構,最終的架構如圖:

1458399-e1b526718a6f8782.png

為每個nav的item新增文字、圖片和selectedImage。然後執行可以看到如下圖:

1458399-7a0187420a32ac59.png

現在我們來改變tabBar的背景顏色

設定tabBar的背景色

建立類ANTabBarController繼承自UITabBarController,並與storyBoard中的TabBarController關聯。在viewDidLoad中新增如下程式碼:[[UITabBar appearance] setBackgroundColor:[UIColor redColor]];,執行結果如圖:

1458399-6d3bdf53c0f58f00.png

但這個紅色並不是真正的紅色,而是系統處理過的紅色,修改首頁介面顏色為紅色來做個對比:

1458399-5e04ea9a88ef28a3.png

所以直接通過[[UITabBar appearance] setBackgroundColor:[UIColor redColor]];(此處寫錯,應該是[[UITabBar appearance] setBarTintColor:[UIColor redColor]];在demo中是寫對的,只是這裡寫錯了)。來改變tabar的顏色是不能得到想要的顏色的。如果想要得到想要的顏色需要再另外新增一句:[UITabBar appearance].translucent = NO;這句表示取消tabBar的透明效果。

第二種方法是你可以在tabBar上新增一個有顏色的View:

1458399-f0a1197f3991fdea.png

這樣也可以實現相同的效果

還有第三種方法就是使用背景圖片:

[[UITabBar appearance] setBackgroundImage:[UIImage imageNamed:@"tabBarBackgroundImage"]];

[UITabBar appearance].translucent = NO;

但同樣需要[UITabBar appearance].translucent = NO;

接下來需要處理的第二個問題就是:tabBarItem

設定tabBarItem

首先很多運用中需要在點選某個item後,需要改變背景色,可以通過tabBar的selectionIndicatorImage屬性來實現。

第一種方式就是讓美工切出符合的圖直接放上去,但這種方式美工需要切多個不同尺寸的圖,不方便,如果背景色改變,全部圖又要重新切,很麻煩。

第二種方式就是自己畫,畫好後,如果背景色需要改變只需要修改顏色就可以了,不用切圖程式碼實現:

1458399-9add2c94296a5323.png
1458399-faa5e0a732290ded.png

現在選中顏色已經改變了,如圖:

1458399-1b16793bfb232d1f.png

好了,tabBarItem的選中時的背景顏色已經弄好了。解決下一個問題

tabBarItem圖示文字顏色修改

應該發現了tabBarItem的圖示和文字的預設顏色是灰色,選中顏色是藍色。這是系統預設給圖示、文字修改成了灰色和藍色。如果要改變選中item的顏色可以直接使用tabBar的tintColor來實現,但是如果圖示換成別的顏色了又要重新修改tintColor,很不方便。所以重寫一個繼承與UITabBarItem的自定義類,在initWithCoder:方法中實現如下程式碼:

1458399-13aae7b25531dd55.png

mostColorWithImage:方法是自定義的獲取圖片主顏色的方法,具體程式碼:

1458399-bd938dcb008561ff.png
1458399-c631b1caa5dc8ee5.png
1458399-d440daf7502dbe4d.png

這樣就完成了。

相關文章