改变UITabBar的色调/背景颜色

87

在IT技术中,UINavigationBar和UISearchBar都有一个tintColor属性,允许您更改这些项目的色调颜色(是的,很惊讶)。我希望在我的应用程序中对UITabBar执行相同的操作,但是发现无法将其从默认的黑色更改。有任何想法吗?


这些都是很好的答案。如果您允许自动旋转,将子视图的autoresizingMask设置为具有灵活的边距和大小会很有帮助,否则新的背景不会随选项卡栏一起调整大小。 - pmdj
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;

3
不行。正如我指出的,它们适用于iOS 5。您可以使用条件编译语句针对特定版本进行目标定位。 http://cocoawithlove.com/2010/07/tips-tricks-for-conditional-ios3-ios32.html - imnk
谢谢,这很有帮助 :) 以前从未知道有这样的东西。 - Veeru
对于iOS 7,如果您想更改背景颜色,请使用[UITabBar appearance] setBarTintColor。 - Zeezer

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

1
这是一种有点奇怪的解决方案,它只是在选项卡栏上放置了一个半透明的棕色矩形。问题是所有的按钮都变成了棕色,而不仅仅是背景。然而,这似乎是目前为止任何人提出的最佳选择。 - Jonah
这是私有 API 吗?如果我在我的应用程序中使用它,会被拒绝吗? - Frank
选项卡栏属性以前是不可访问的。 - coneybeare
好的,原帖作者要求更改背景颜色... 这也是一个非常古老的问题和答案,现在有更好的方法来解决它。 - coneybeare
您可以通过子类化UITabBarItem来更改高亮的内容:https://dev59.com/rU_Ta4cB1Zd3GeqPDLVa - Frank
显示剩余3条评论

34

我对最终答案提出了一点补充。 虽然基本方案是正确的,但使用部分透明颜色的技巧可以改进。 我假设它仅用于让默认梯度显示出来。 哦,还有,TabBar的高度至少在OS 3中为49像素,而不是48像素。

因此,如果您有一个适当的带渐变的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];

}

1
如果您想为其添加背景图片使其更美观,请参考此链接:http://duivesteyn.net/2010/01/16/iphone-custom-tabbar-background-image/。 - oberbaum
1
我认为应该这样写:[[self tabBar] insertSubview:v atIndex:0]; - Vibhor Goyal
我知道这个答案有点老,但对我很有用。由于我需要一个自定义图像而不是颜色,所以我将您的答案与此答案tint on bars - UITabBar part混合使用。 - RaphaelDDL

27

当您仅使用addSubview时,您的按钮将失去可点击性,因此请改用

[[self tabBar] addSubview:v];

使用:

[[self tabBar] insertSubview:v atIndex:0];

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

什么是tabBarController?它是符合UITabBarDelegate的控制器吗?你能解释一下吗? - The iCoder

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];

条形样式在您的视图内容和选项卡栏之间添加了一个微妙的分隔符。


7

要实现这个功能并没有简单的方法,你需要继承UITabBar并实现自定义绘制来达到你的目的。这需要相当多的工作,但是它可能是值得的。我建议向苹果提交一个bug,以便将其添加到未来的iPhone SDK中。


4
先生,您是否向苹果公司提交过一个漏洞报告? - sagarkothari

5

[[self tabBar] insertSubview:v atIndex:0];

对我来说完全有效。

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"];

试试这个!!!


3
 [[UITabBar appearance] setTintColor:[UIColor redColor]];
 [[UITabBar appearance] setBarTintColor:[UIColor yellowColor]];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接