UINavigationBar 和 UISearchBar 都有一个 tintColor 属性,允许您更改这两个项目的色调颜色(我知道,这很奇怪)。我想在我的应用程序中对 UITabBar 做同样的事情,但现在找到了将其从默认黑色更改的方法。有任何想法吗?
18 回答
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;
我已经能够通过子类化 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
我对最终答案有一个附录。虽然基本方案是正确的,但可以改进使用部分透明颜色的技巧。我假设它只是为了让默认渐变显示出来。哦,另外,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];
}
当您只使用 addSubview 您的按钮将失去可点击性,所以而不是
[[self tabBar] addSubview:v];
采用:
[[self tabBar] insertSubview:v atIndex:0];
没有简单的方法可以做到这一点,你基本上需要继承 UITabBar 并实现自定义绘图来做你想做的事。对于效果来说,这是相当多的工作,但它可能是值得的。我建议向 Apple 提交一个错误,以将其添加到未来的 iPhone SDK 中。
以下是对此的完美解决方案。这适用于 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];
}
在 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];
栏样式在您的视图内容和标签栏之间放置了一个微妙的分隔符。
[[self tabBar] insertSubview:v atIndex:0];
非常适合我。
对我来说,更改 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"];
试试这个!!!
[[UITabBar appearance] setTintColor:[UIColor redColor]];
[[UITabBar appearance] setBarTintColor:[UIColor yellowColor]];
仅用于背景颜色
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]];
[v setBackgroundColor ColorwithRed: Green: Blue: ];
现有答案中有一些好主意,许多工作方式略有不同,您选择的内容还取决于您的目标设备以及您想要实现的外观。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)];
}
在哪里selected
和unselected
是UIImage
您选择的对象。如果您希望它们成为纯色,我发现的最简单的解决方案是创建UIView
所需的 a backgroundColor
,然后在UIImage
QuartzCore 的帮助下将其渲染为 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) 部分的selected
和unselected
图像中。
另一个解决方案(这是一个 hack)是将 tabBarController 上的 alpha 设置为 0.01,这样它实际上是不可见的,但仍然可以点击。然后在 MainWindow 笔尖的底部设置一个 ImageView 控件,并在 alpha'ed tabBarCONtroller 下方使用您的自定义标签栏图像。然后在 tabbarcontroller 切换视图时交换图像、更改颜色或突出显示。
但是,您将失去“...更多”并自定义功能。
嗨,我正在使用 iOS SDK 4,我只用两行代码就可以解决这个问题,就像这样
tBar.backgroundColor = [UIColor clearColor];
tBar.backgroundImage = [UIImage imageNamed:@"your-png-image.png"];
希望这可以帮助!
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];
}
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)
Swift 3 使用您AppDelegate
的外观执行以下操作:
UITabBar.appearance().barTintColor = your_color