Iphone 如何更改UINavigationBar按钮项上的文本颜色

Iphone 如何更改UINavigationBar按钮项上的文本颜色,iphone,cocoa-touch,Iphone,Cocoa Touch,我有一个UINavigationController,我使用Interface Builder中导航栏的“着色”属性将其更改为白色。但是按钮和标题中的文本仍然是默认颜色,白色,因此在白色背景下丢失。有人知道如何解决这个问题吗?难道你不能迭代UINavigationBar视图的内容来找到awakeFromNib中的按钮吗?这里有一种方法: [[theNavigationBar.subviews objectAtIndex:1] setTitleColor:[UIColor redColor] fo

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

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

这里有一种方法:

[[theNavigationBar.subviews objectAtIndex:1] setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[[theNavigationBar.subviews objectAtIndex:2] setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
然而,巨大的警告。这很可能会在未来的操作系统版本中中断,因此不建议这样做


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

或者你使用自己的按钮栏项子类和你指定的setter,lus不是iPhone os 3。假设我按照醉鬼的建议为每个按钮显示文本颜色。我求助于在一些状态下为back button和在一些状态下的常规按钮制作一系列图像,并将它们放在自定义UIButton子类中,设置适当的样式

作为一个解决方案,它的扩展性不是特别好,但我的需求非常简单。但是,如果内置控件中的子视图顺序发生更改,它的优点是不会中断,这是该方法的明显缺点。需要几个图像的缺点。另一件棘手的事情是处理方向的改变,因为按钮应该改变大小

另一个相关的注意事项是,如果您确实更改了导航栏的着色颜色,则它与用于自定义选项卡栏顺序的特殊“更多”视图控制器不匹配。在该视图中,似乎没有任何“可接受”的方法来更改工具栏的颜色。

这里有一种干净的方法(依赖公共API)来实现这一点:您应该使用导航项的标题视图属性来应用您自己的UILabel,您将在其上自定义文本颜色


从iOS 5开始,使用UIBarButtonItem外观代理将更容易:

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

}

在application:didFinishLaunchingWithOptions中设置此选项:

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

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

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

你可以。但我在我的按钮上做了一个setxtcolor:forStates:,它似乎被忽略了。但他会坚持下去。此外,它还接近于私有api(或者至少是私有的假定UI结构知识)的使用。虽然它有点像私有API,但它至少不做任何假设:如果内部结构发生变化,您的代码将无法检测到您正在搜索的任何条件。但我还没有完成UINavigationBar。你也可以编写防御代码以确保你不会爆发。但是,我还是喜欢一个真正的API对于单个导航条来说,这是一个很好的解决方案。但正如你所承认的,它的伸缩性并不好。我通常会使用这样的解决方案。但我正在开发一款具有非常动态ui需求的应用程序。我可能会被迫做一些更粗糙的事情:-(我会发现这一点特别脆弱,因为您是通过索引访问项的。更安全的做法是获取所有子视图项,将类与您期望的进行比较,甚至使用位置。但这正是想法的核心。:)对。我没有公布实际的方法。这只是第一个有效的方法。防御性编程ftw。真有趣,我几乎两个月都没有得到答案,然后我得到了一整批答案。。。无论如何,我把这个标记为答案,因为它是最具伸缩性的,尽管我最终使用的是自定义按钮图像。希望v3.0版的官方API中有一些东西。这不会影响导航项左右按钮的颜色。-1!:)好吧,例如,这并没有解决“后退”按钮的问题,但它解决了主标题视图的问题。同样的方法也可以应用于“后退”按钮,您可以在该按钮上设置自定义视图。然后我同意你必须用正确的背景图像等来构建正确的视图,但这是“可行的”,并且使用公共API。当然,如果你回答不同的问题,你会被否决。对于这个问题,你的答案是可以的:这也可以适用于个别的维吾尔人。对于栏的实际按钮,您可以写入:[按钮setTitleTextAttributes:textAttributes For状态:UIControlStateNormal];
 NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys: 
                        [UIColor blackColor], 
                        UITextAttributeTextColor, 
                        [UIColor clearColor], 
                        UITextAttributeTextShadowColor, nil];

[[UIBarButtonItem appearance] setTitleTextAttributes: attributes
                                            forState: UIControlStateNormal];
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];