2009-02-02 117 views
18

我有一个UINavigationController,并且使用Interface Builder中导航栏的Tint属性将其更改为白色。但按钮和标题中的文本仍然是默认的颜色,白色,因此在白色背景下丢失。任何人都知道如何解决这个问题?如何更改UINavigationBar按钮项上的文本颜色

回答

31

随着iOS 5的这个更容易,使用的UIBarButtonItem外观代理:

NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys: 
         [UIColor blackColor], 
         UITextAttributeTextColor, 
         [UIColor clearColor], 
         UITextAttributeTextShadowColor, nil]; 

[[UIBarButtonItem appearance] setTitleTextAttributes: attributes 
              forState: UIControlStateNormal]; 

将其设置在应用程序中:didFinishLaunchingWithOptions:

1

你不能迭代UINavigationBar视图的内容来查找awakeFromNib中的按钮吗?

+0

您可以。但我正在做setTextColor:forStates:在我的按钮上,它似乎被忽略。但会坚持下去。 此外,它与私有api(或至少私人承担的用户界面结构的知识)的使用接近。 – schwa 2009-03-26 02:40:42

+0

哦,我收回它 - 它确实有效。看到后续的答案... – schwa 2009-03-26 02:41:55

+0

我偷看了这样的其他意见。虽然这是一个私人的API-ish,但它至少不会做出任何假设:如果内部发生变化,您的代码将无法检测到您搜索的任何条件。但我还没有完成UINavigationBar。 – 2009-03-26 02:42:47

8

这里有一种方法:

[[theNavigationBar.subviews objectAtIndex:1] setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; 
[[theNavigationBar.subviews objectAtIndex:2] setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; 

然而,巨大的,需要注意的。这很可能会在未来的操作系统版本上崩溃,因此不推荐。

至少你应该进行大量的测试,并确保你对导航栏的子视图布局的假设是正确的。

+1

我会发现,特别是脆弱的,因为你正在通过索引访问项目。更安全的是获得所有的子视图项目,比较你期望的类别,甚至使用职位。但这正是这个想法的核心。 :) – 2009-03-26 17:53:09

2

或者你用你自己的按钮栏物品子类与你指定一个二传手,逻辑单元不是iPhone OS 3假设揭露文字的颜色为每个按钮

2

我一样drunknbass建议。我采取了在几种状态下为后退按钮制作一系列图像,并在少数几个州制作了常规按钮,并将它们放入一个定制的UIButton子类中,以设置适当的样式。

作为一种解决方案,它不能很好地扩展,但我的需求很简单。它具有不会打破内置控件中的子视图订单是否改变的优势,这是该方法明显的缺点。需要几个图像的缺点。另一个棘手的问题是处理方向更改,因为按钮应该更改大小。

在相关说明中,如果更改了导航栏的色调颜色,它将无法与特殊的“更多”视图控制器一起使用,以定制选项卡栏的顺序。似乎没有任何“可接受”的方法来改变该视图中工具栏的颜色。

0

这里的清洁方式(依靠公共API)来做到这一点恕我直言:你应该使用navigationItemtitleView属性以将它自己的UILabel上,您将定制textColor

 
 
UILabel* lbl = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 20)]; 
lbl.textAlignment=UITextAlignmentCenter; 
lbl.backgroundColor=[UIColor clearColor]; 
lbl.textColor=[UIColor colorWithRed:0.18 green:0.2 blue:0.56 alpha:1]; 
theControllerOnWhichYouWantToHaveATitleWithYourOwnColor.navigationItem.titleView=lbl; 
[lbl release]; 
 

11
for (id subView in theNavigationBar.subviews) { 
    if ([subView isKindOfClass:[UIButton class]]) { 
     [(UIButton *)subView setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; 
     [(UIButton *)subView setTitleShadowColor:[UIColor clearColor] forState:UIControlStateNormal]; 
    } 

} 
-1

您可以通过在导航栏中添加如下标签来更改标题外观。

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 35)]; 
label.backgroundColor = [UIColor clearColor]; 
label.textAlignment = UITextAlignmentCenter; 
label.textColor =[UIColor whiteColor]; 
label.text=self.title; 
self.navigationItem.titleView = viewLabel; 
[label release];