简体   繁体   English

如何更改标签栏上的非活动图标/文本颜色?

[英]How to change inactive icon/text color on tab bar?

How can I change inactive icon/text color on iOS 7 tab bar?如何更改 iOS 7 标签栏上的非活动图标/文本颜色? The one in gray color.灰色的那个。

在此处输入图像描述

You can also set the property Render As of your tab bar images within your asset catalog directly.您还可以直接在资产目录中设置标签栏图像的Render As属性。 There you have the option to set the property to Default , Original Image and Template Image .在那里您可以选择将属性设置为DefaultOriginal ImageTemplate Image

设置图像的渲染选项

In every first ViewController for each TabBar:在每个 TabBar 的每个第一个 ViewController 中:

- (void)viewDidLoad
{
    [super viewDidLoad];

    // changing the unselected image color, you should change the selected image 
    // color if you want them to be different
    self.tabBarItem.selectedImage = [[UIImage imageNamed:@"yourImage_selectedImage"]
    imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

    self.tabBarItem.image = [[UIImage imageNamed:@"yourImage_image"] 
    imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
}

The clue of this code is 'UIImageRenderingModeAlwaysOriginal':这段代码的线索是“UIImageRenderingModeAlwaysOriginal”:

Rendering Modes by Apple Documentation: Apple 文档的渲染模式:

UIImageRenderingModeAutomatic,          // Use the default rendering mode for the context where the image is used    
UIImageRenderingModeAlwaysOriginal,     // Always draw the original image, without treating it as a template
UIImageRenderingModeAlwaysTemplate,     // Always draw the image as a template image, ignoring its color information

To change text color:要更改文本颜色:

In AppDelegate:在 AppDelegate 中:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Add this if you only want to change Selected Image color 
    // and/or selected image text
    [[UITabBar appearance] setTintColor:[UIColor redColor]];

    // Add this code to change StateNormal text Color,
    [UITabBarItem.appearance setTitleTextAttributes:
    @{NSForegroundColorAttributeName : [UIColor greenColor]} 
    forState:UIControlStateNormal];

    // then if StateSelected should be different, you should add this code
    [UITabBarItem.appearance setTitleTextAttributes:
    @{NSForegroundColorAttributeName : [UIColor purpleColor]} 
    forState:UIControlStateSelected];

    return YES;
}

for changing color of unselect icons of tabbar用于更改标签栏取消选择图标的颜色

For below iOS 10:对于 iOS 10 以下:

// this code need to be placed on home page of tabbar    
for(UITabBarItem *item in self.tabBarController.tabBar.items) {
    item.image = [item.image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
}

Above iOS 10: iOS 10 以上:

// this need to be in appdelegate didFinishLaunchingWithOptions
[[UITabBar appearance] setUnselectedItemTintColor:[UIColor blackColor]];

Instead adding it to every UIViewController, you can create an extension and alter the appearance of an UITabBarController您可以创建一个扩展并更改 UITabBarController 的外观,而不是将其添加到每个 UIViewController

Change unselected icon color更改未选中的图标颜色

extension UITabBarController {
    override public func viewDidLoad() {
        super.viewDidLoad()

        tabBar.items?.forEach({ (item) -> () in
           item.image = item.selectedImage?.imageWithColor(UIColor.redColor()).imageWithRenderingMode(.AlwaysOriginal)
        })
    }
}

Change selected icon color更改选定的图标颜色

let tabBarAppearance = UITabBar.appearance()
tabBarAppearance.tintColor = UIColor.blackColor()

Change (un)selected title color更改(取消)选定的标题颜色

let tabBarItemApperance = UITabBarItem.appearance()
tabBarItemApperance.setTitleTextAttributes([NSFontAttributeName: UIFont(name: "Edmondsans-Bold", size: 10)!, NSForegroundColorAttributeName:UIColor.redColor()], forState: UIControlState.Normal)
tabBarItemApperance.setTitleTextAttributes([NSFontAttributeName: UIFont(name: "Edmondsans-Bold", size: 10)!, NSForegroundColorAttributeName:UIColor.blackColor()], forState: UIControlState.Selected)

UIImage extension UIImage 扩展

extension UIImage {
    func imageWithColor(color1: UIColor) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
        color1.setFill()

        let context = UIGraphicsGetCurrentContext()
        CGContextTranslateCTM(context!, 0, self.size.height)
        CGContextScaleCTM(context!, 1.0, -1.0);
        CGContextSetBlendMode(context!, .Normal)

        let rect = CGRectMake(0, 0, self.size.width, self.size.height) as CGRect
        CGContextClipToMask(context!, rect, self.CGImage!)
        CGContextFillRect(context!, rect)

        let newImage = UIGraphicsGetImageFromCurrentImageContext()! as UIImage
        UIGraphicsEndImageContext()

        return newImage
    }
}

There is a better way without using each ViewController by only using appdelegate.m只使用 appdelegate.m 不使用每个 ViewController 有更好的方法

In your AppDelegate.m - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions function, try this.在你的AppDelegate.m - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions函数中,试试这个。

UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;
UITabBar *tabBar = tabBarController.tabBar;

// repeat for every tab, but increment the index each time
UITabBarItem *firstTab = [tabBar.items objectAtIndex:0];

// also repeat for every tab
firstTab.image = [[UIImage imageNamed:@"someImage.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal ];
firstTab.selectedImage = [[UIImage imageNamed:@"someImageSelected.png"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

To change tab selection color instead blue color:要更改选项卡选择颜色而不是蓝色:

  1. Select the tabItem.选择tabItem。
  2. From "Show the Identity inspector" in the right side menu.从右侧菜单中的“显示身份检查器”。
  3. Set "tintColor" attribute with your prefer color.使用您喜欢的颜色设置“tintColor”属性。

在此处输入图片说明

The new answer to do this programmatically as of iOS 10+ with Swift 3 is to use the unselectedItemTintColor API.从带有 Swift 3 的 iOS 10+ 开始,以编程方式执行此操作的新答案是使用unselectedItemTintColor API。 For example, if you have initialized your tab bar controller inside your AppDelegate , it would looks like the following:例如,如果您在AppDelegate初始化了标签栏控制器,它将如下所示:

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        ...

        let firstViewController = VC1()
        let secondViewController = VC2()
        let thirdViewController = VC3()


        let tabBarCtrl = UITabBarController()
        tabBarCtrl.viewControllers = [firstViewController, secondViewController, thirdViewController]

        // set the color of the active tab
        tabBarCtrl.tabBar.tintColor = UIColor.white

        // set the color of the inactive tabs
        tabBarCtrl.tabBar.unselectedItemTintColor = UIColor.gray

        // set the text color

        ...
    }

And for setting the selected and unselected text colors:以及设置选中和未选中的文本颜色:

let unselectedItem = [NSForegroundColorAttributeName: UIColor.green]
let selectedItem = [NSForegroundColorAttributeName: UIColor.red]

self.tabBarItem.setTitleTextAttributes(unselectedItem, for: .normal)
self.tabBarItem.setTitleTextAttributes(selectedItem, for: .selected)

In Swift 3.0 you can write it as follows在 Swift 3.0 中你可以这样写

For unselected tab bar image对于未选中的标签栏图像

viewController.tabBarItem.image = UIImage(named: "image")?.withRenderingMode(.alwaysOriginal)

For selected tab bar image对于选定的标签栏图像

viewController.tabBarItem.selectedImage = UIImage(named: "image")?.withRenderingMode(.alwaysOriginal)

Instead of adding rendering image code in each viewController for tabBarItem, use extension不要在每个 viewController 中为 tabBarItem 添加渲染图像代码,而是使用扩展

extension UITabBar{
     func inActiveTintColor() {
        if let items = items{
            for item in items{
                item.image =  item.image?.withRenderingMode(.alwaysOriginal)
                item.setTitleTextAttributes([NSForegroundColorAttributeName : UIColor.green], for: .normal)
                item.setTitleTextAttributes([NSForegroundColorAttributeName : UIColor.white], for: .selected)
            }
        }
    }
}

Then call this in your UITabBarController class like然后在您的 UITabBarController 类中调用它,例如

class CustomTabBarViewController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()
        tabBar.inActiveTintColor()
    }
}

You will get output like :您将获得如下输出: 在此处输入图片说明 NOTE: Don't forget to assign CustomTabBarViewController class to your TabBarController in storyboard.注意:不要忘记将 CustomTabBarViewController 类分配给故事板中的 TabBarController。

I think it's time to use我想是时候使用了

UITabBar unselectedItemTintColor appearance UITabBar unselectedItemTintColor 外观

/// Unselected items in this tab bar will be tinted with this color. Setting this value to nil indicates that UITabBar should use its default value instead.
    @available(iOS 10.0, *)
    @NSCopying open var unselectedItemTintColor: UIColor?

Just add this line into App did finish launching只需将此行添加到 App 中即可完成启动

UITabBar.appearance().unselectedItemTintColor = {your color}
// Example
UITabBar.appearance().unselectedItemTintColor = .black

标签栏 unselectedItemTintColor 外观

I think @anka's answer is quite good, and I also added the following code to enable tint color for highlighted items:我认为@anka 的回答非常好,我还添加了以下代码来为突出显示的项目启用色调颜色:

    let image = UIImage(named:"tab-account")!.imageWithRenderingMode(.AlwaysTemplate)
    let item = tabBar.items![IC.const.tab_account] as! UITabBarItem
    item.selectedImage = image

Or in one line:或者在一行中:

    (tabBar.items![IC.const.tab_account] as! UITabBarItem).selectedImage = UIImage(named:"tab-account")!.imageWithRenderingMode(.AlwaysTemplate)

So it looks like:所以它看起来像:

标签栏

You only need put this code in your first ViewController called for TabBarViewController (ViewDidload):您只需将此代码放在为 TabBarViewController (ViewDidload) 调用的第一个 ViewController 中:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [self loadIconsTabBar];
}

-(void) loadIconsTabBar{
        UITabBar *tabBar = self.tabBarController.tabBar;
        //
        UITabBarItem *firstTab = [tabBar.items objectAtIndex:0];
        UITabBarItem *secondTab = [tabBar.items objectAtIndex:1];
        firstTab.image = [[UIImage imageNamed:@"icono1.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal ];
        firstTab.selectedImage = [[UIImage imageNamed:@"icono1.png"]imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
        secondTab.image = [[UIImage imageNamed:@"icono2.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal ];
        secondTab.selectedImage = [[UIImage imageNamed:@"icono2.png"]imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
    }

You only need put this code in your appDelegate.m called (didFinishLaunchingWithOptions):您只需将此代码放在名为 (didFinishLaunchingWithOptions) 的 appDelegate.m 中:

[UITabBarItem.appearance setTitleTextAttributes:
@{NSForegroundColorAttributeName : [UIColor whiteColor]}
                                       forState:UIControlStateNormal];


[UITabBarItem.appearance setTitleTextAttributes:
@{NSForegroundColorAttributeName : [UIColor orangeColor]}
                                       forState:UIControlStateSelected];

[[UITabBar appearance] setTintColor:[UIColor whiteColor]]; // for unselected items that are gray
[[UITabBar appearance] setUnselectedItemTintColor:[UIColor whiteColor]]; 

If you are looking for an iOS 11 swift 4 solution, do something like this in the appDelegate.如果您正在寻找 iOS 11 swift 4 解决方案,请在 appDelegate 中执行类似操作。 This is changing all the unselected ones to black.这会将所有未选择的更改为黑色。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    UITabBar.appearance().unselectedItemTintColor = UIColor(displayP3Red: 0, green: 0, blue: 0, alpha: 1)

    return true
}

The best way to change the color of the Selected tab bar item is add a single code on appdelegate didFinishLaunchingWithOptions method更改选定标签栏项目颜色的最佳方法是在 appdelegate didFinishLaunchingWithOptions方法上添加单个代码

UITabBar.appearance().tintColor = UIColor(red: 242/255.0, green: 32/255.0, blue: 80/255.0, alpha: 1.0)

It will change the selected item text color它将更改所选项目的文本颜色

您可以通过界面构建​​器完成所有操作,查看此答案,它显示了如何进行活动和非活动, “更改故事板中的选项卡栏项目选择的颜色”

for swift 3:对于快速 3:

    // both have to declare in view hierarchy method
    //(i.e: viewdidload, viewwillappear) according to your need.

    //this one is, when tab bar is selected
    self.tabBarItem.selectedImage = UIImage.init(named: "iOS")?.withRenderingMode(.alwaysOriginal)

    // this one is when tab bar is not selected
    self.tabBarItem.image = UIImage.init(named: "otp")?.withRenderingMode(.alwaysOriginal)

Swift UI: to change active item color you only have to add Swift UI:要更改活动项目颜色,您只需添加

TabView().accentColor(you_Color_here)

to change inactive item color更改非活动项目颜色

.onAppear{
              UITabBar.appearance().unselectedItemTintColor = UIColor(theme.colors.secondary)
            }

this worked for me SWIFT 3这对我有用 SWIFT 3

viewConroller.tabBarItem = UITabBarItem(title: "", image: UIImage(named: "image")?.withRenderingMode(.alwaysOriginal),
                                selectedImage:  UIImage(named: "image"))

Swift解决方案:对于 UNSELECED 项目:在每个 ViewController -> ViewDidLoad()

self.tabBarItem = UITabBarItem(title: nil, image: UIImage(named: "PHOTO_NAME")?.imageWithRenderingMode(.AlwaysOriginal), selectedImage: UIImage(named: "NAME"))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM