87

UINavigationBar 和 UISearchBar 都有一个 tintColor 属性,允许您更改这两个项目的色调颜色(我知道,这很奇怪)。我想在我的应用程序中对 UITabBar 做同样的事情,但现在找到了将其从默认黑色更改的方法。有任何想法吗?

4

18 回答 18

105

iOS 5 添加了一些新的外观方法来自定义大多数 UI 元素的外观。

您可以使用外观代理来定位应用程序中的每个 UITabBar 实例。

对于 iOS 5 + 6:

[[UITabBar appearance] setTintColor:[UIColor redColor]];

对于 iOS 7 及更高版本,请使用以下内容:

[[UITabBar appearance] setBarTintColor:[UIColor redColor]];

使用外观代理将更改整个应用程序中的任何选项卡栏实例。对于特定实例,请使用该类的新属性之一:

UIColor *tintColor; // iOS 5+6
UIColor *barTintColor; // iOS 7+
UIColor *selectedImageTintColor;
UIImage *backgroundImage;
UIImage *selectionIndicatorImage;
于 2011-12-19T21:18:08.930 回答
47

我已经能够通过子类化 UITabBarController 并使用私有类来使其工作:

@interface UITabBarController (private)
- (UITabBar *)tabBar;
@end

@implementation CustomUITabBarController


- (void)viewDidLoad {
    [super viewDidLoad];

    CGRect frame = CGRectMake(0.0, 0.0, self.view.bounds.size.width, 48);
    UIView *v = [[UIView alloc] initWithFrame:frame];
    [v setBackgroundColor:kMainColor];
    [v setAlpha:0.5];
    [[self tabBar] addSubview:v];
    [v release];

}
@end
于 2009-03-14T17:17:56.867 回答
34

我对最终答案有一个附录。虽然基本方案是正确的,但可以改进使用部分透明颜色的技巧。我假设它只是为了让默认渐变显示出来。哦,另外,TabBar 的高度是 49 像素而不是 48 像素,至少在 OS 3 中是这样。

所以,如果你有一个合适的 1 x 49 的渐变图像,这是你应该使用的 viewDidLoad 版本:

- (void)viewDidLoad {

    [super viewDidLoad]; 

    CGRect frame = CGRectMake(0, 0, 480, 49);
    UIView *v = [[UIView alloc] initWithFrame:frame];
    UIImage *i = [UIImage imageNamed:@"GO-21-TabBarColorx49.png"];
    UIColor *c = [[UIColor alloc] initWithPatternImage:i];
    v.backgroundColor = c;
    [c release];
    [[self tabBar] addSubview:v];
    [v release];

}
于 2009-12-30T20:51:34.910 回答
27

当您只使用 addSubview 您的按钮将失去可点击性,所以而不是

[[self tabBar] addSubview:v];

采用:

[[self tabBar] insertSubview:v atIndex:0];
于 2009-10-05T10:45:43.610 回答
7

没有简单的方法可以做到这一点,你基本上需要继承 UITabBar 并实现自定义绘图来做你想做的事。对于效果来说,这是相当多的工作,但它可能是值得的。我建议向 Apple 提交一个错误,以将其添加到未来的 iPhone SDK 中。

于 2009-02-20T20:11:21.487 回答
7

以下是对此的完美解决方案。这适用于 iOS5 和 iOS4。

//---- For providing background image to tabbar
UITabBar *tabBar = [tabBarController tabBar]; 

if ([tabBar respondsToSelector:@selector(setBackgroundImage:)]) {
    // ios 5 code here
    [tabBar setBackgroundImage:[UIImage imageNamed:@"image.png"]];
} 
else {
    // ios 4 code here
    CGRect frame = CGRectMake(0, 0, 480, 49);
    UIView *tabbg_view = [[UIView alloc] initWithFrame:frame];
    UIImage *tabbag_image = [UIImage imageNamed:@"image.png"];
    UIColor *tabbg_color = [[UIColor alloc] initWithPatternImage:tabbag_image];
    tabbg_view.backgroundColor = tabbg_color;
    [tabBar insertSubview:tabbg_view atIndex:0];
}
于 2012-02-03T05:21:00.383 回答
7

在 iOS 7 上:

[[UITabBar appearance] setBarTintColor:[UIColor colorWithRed:(38.0/255.0) green:(38.0/255.0) blue:(38.0/255.0) alpha:1.0]];

我还建议首先根据您的视觉需求进行设置:

[[UITabBar appearance] setBarStyle:UIBarStyleBlack];

栏样式在您的视图内容和标签栏之间放置了一个微妙的分隔符。

于 2014-01-02T18:46:44.977 回答
5

[[self tabBar] insertSubview:v atIndex:0]; 非常适合我。

于 2010-06-03T18:12:09.223 回答
5

对我来说,更改 Tabbar 的颜色非常简单,例如:-

[self.TabBarController.tabBar setTintColor:[UIColor colorWithRed:0.1294 green:0.5686 blue:0.8353 alpha:1.0]];


[self.TabBarController.tabBar setTintColor:[UIColor "YOUR COLOR"];

试试这个!!!

于 2013-03-01T09:34:44.547 回答
3
 [[UITabBar appearance] setTintColor:[UIColor redColor]];
 [[UITabBar appearance] setBarTintColor:[UIColor yellowColor]];
于 2014-10-31T01:16:24.517 回答
2

仅用于背景颜色

Tabbarcontroller.tabBar.barTintColor=[UIColor redcolour];

或者这个在 App Delegate

[[UITabBar appearance] setBackgroundColor:[UIColor blackColor]];

用于更改标签栏未选择图标的颜色

对于 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];
}

iOS 10 以上:

// this need to be in appdelegate didFinishLaunchingWithOptions
[[UITabBar appearance] setUnselectedItemTintColor:[UIColor blackColor]];
于 2016-11-03T13:27:12.650 回答
1
[v setBackgroundColor ColorwithRed: Green: Blue: ];
于 2009-06-08T06:45:17.183 回答
1

现有答案中有一些好主意,许多工作方式略有不同,您选择的内容还取决于您的目标设备以及您想要实现的外观。UITabBar在自定义外观方面是出了名的不直观,但这里还有一些技巧可能会有所帮助:

1)。如果您想摆脱光滑的覆盖层以获得更平坦的外观,请执行以下操作:

tabBar.backgroundColor = [UIColor darkGrayColor]; // this will be your background
[tabBar.subviews[0] removeFromSuperview]; // this gets rid of gloss

2)。要将自定义图像设置为 tabBar 按钮,请执行以下操作:

for (UITabBarItem *item in tabBar.items){
    [item setFinishedSelectedImage:selected withFinishedUnselectedImage:unselected];
    [item setImageInsets:UIEdgeInsetsMake(6, 0, -6, 0)];
}

在哪里selectedunselectedUIImage您选择的对象。如果您希望它们成为纯色,我发现的最简单的解决方案是创建UIView所需的 a backgroundColor,然后在UIImageQuartzCore 的帮助下将其渲染为 a。我在一个类别中使用以下方法UIView来获取UIImage视图的内容:

- (UIImage *)getImage {
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, [[UIScreen mainScreen]scale]);
    [[self layer] renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return viewImage;
}

3) 最后,您可能想要自定义按钮标题的样式。做:

for (UITabBarItem *item in tabBar.items){
    [item setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys:
                [UIColor redColor], UITextAttributeTextColor,
                [UIColor whiteColor], UITextAttributeTextShadowColor,
                [NSValue valueWithUIOffset:UIOffsetMake(0, 1)], UITextAttributeTextShadowOffset,
                [UIFont boldSystemFontOfSize:18], UITextAttributeFont,
            nil] forState:UIControlStateNormal];
}

这使您可以进行一些调整,但仍然非常有限。特别是,您不能随意修改文本在按钮内的放置位置,并且不能为选中/未选中的按钮设置不同的颜色。如果您想做更具体的文本布局,只需设置UITextAttributeTextColor为清晰并将您的文本添加到第 (2) 部分的selectedunselected图像中。

于 2013-02-20T21:23:41.183 回答
0

另一个解决方案(这是一个 hack)是将 tabBarController 上的 alpha 设置为 0.01,这样它实际上是不可见的,但仍然可以点击。然后在 MainWindow 笔尖的底部设置一个 ImageView 控件,并在 alpha'ed tabBarCONtroller 下方使用您的自定义标签栏图像。然后在 tabbarcontroller 切换视图时交换图像、更改颜色或突出显示。

但是,您将失去“...更多”并自定义功能。

于 2011-08-03T11:09:13.253 回答
0

嗨,我正在使用 iOS SDK 4,我只用两行代码就可以解决这个问题,就像这样

tBar.backgroundColor = [UIColor clearColor];
tBar.backgroundImage = [UIImage imageNamed:@"your-png-image.png"];

希望这可以帮助!

于 2011-12-22T17:55:18.523 回答
0
if ([tabBar respondsToSelector:@selector(setBackgroundImage:)]) {
    // ios 5 code here
    [tabBar setBackgroundImage:[UIImage imageNamed:@"image.png"]];
} 
else {
    // ios 4 code here
    CGRect frame = CGRectMake(0, 0, 480, 49);
    UIView *tabbg_view = [[UIView alloc] initWithFrame:frame];
    UIImage *tabbag_image = [UIImage imageNamed:@"image.png"];
    UIColor *tabbg_color = [[UIColor alloc] initWithPatternImage:tabbag_image];
    tabbg_view.backgroundColor = tabbg_color;
    [tabBar insertSubview:tabbg_view atIndex:0];
}
于 2013-05-07T16:18:49.487 回答
0

Swift 3.0 答案:(来自 Vaibhav Gaikwad)

用于更改标签栏未选择图标的颜色:

if #available(iOS 10.0, *) {
        UITabBar.appearance().unselectedItemTintColor = UIColor.white
    } else {
        // Fallback on earlier versions
        for item in self.tabBar.items! {
            item.image = item.image?.withRenderingMode(UIImageRenderingMode.alwaysOriginal)
        }
}

仅用于更改文本颜色:

UITabBarItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.white], for: .normal)

UITabBarItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.red, for: .selected)
于 2016-11-14T10:02:51.120 回答
0

Swift 3 使用您AppDelegate的外观执行以下操作:

UITabBar.appearance().barTintColor = your_color

于 2017-04-04T18:49:26.367 回答