Iphone 如何在UINavigationController标题视图中自定义后退按钮的文本颜色?

Iphone 如何在UINavigationController标题视图中自定义后退按钮的文本颜色?,iphone,cocoa-touch,Iphone,Cocoa Touch,我在UINavigationController的导航栏上使用了一种自定义的着色颜色,由于颜色太浅,我需要使用深色文本。交换标题视图和我在右侧添加的自定义按钮相对容易,但我似乎无法将自定义视图粘贴在后退按钮上。这就是我现在正在尝试的: UILabel *backLabel = [[UILabel alloc] initWithFrame:CGRectZero]; [backLabel setFont:[UIFont fontWithName:[[UIFont fontNames

我在UINavigationController的导航栏上使用了一种自定义的着色颜色,由于颜色太浅,我需要使用深色文本。交换标题视图和我在右侧添加的自定义按钮相对容易,但我似乎无法将自定义视图粘贴在后退按钮上。这就是我现在正在尝试的:

    UILabel *backLabel = [[UILabel alloc] initWithFrame:CGRectZero];

    [backLabel setFont:[UIFont fontWithName:[[UIFont fontNamesForFamilyName:@"Arial Rounded MT Bold"] objectAtIndex:0] size:24.0]];
    [backLabel setTextColor:[UIColor blackColor]];
    [backLabel setShadowColor:[UIColor clearColor]];

    [backLabel setText:[aCategory displayName]];
    [backLabel sizeToFit];
    [backLabel setBackgroundColor:[UIColor clearColor]];

    UIBarButtonItem *temporaryBarButtonItem=[[UIBarButtonItem alloc] initWithCustomView:backLabel];

    temporaryBarButtonItem.customView = backLabel;
    [backLabel release];

    self.navigationItem.backBarButtonItem = temporaryBarButtonItem;
    [temporaryBarButtonItem release];]

不过,自定义视图并不稳定,而且我看不到任何明显容易的方法来获取默认按钮内的实际文本并开始更改其样式

没有官方的方法可以做到这一点。我能想到的两种方法是:

  • 导航视图树以查找现有的“后退”按钮,并手动设置其文本颜色。这可能不是一个好主意,因为它很脆弱,按钮甚至可能没有可配置的textColor属性

  • 创建自己的后退按钮(即使用自己的图像),并设置其颜色。这是我们在许多地方所做的。这是一个多一点的工作,但结果正是你想要的


我尝试遍历以设置文本,但它最终出现在一个UINavigationItemButtonView上,它似乎只是直接绘制。没有办法设置颜色

我能够让它工作的唯一方法是将文本转换为图像,然后将“后退”按钮设置为图像

UIBarButtonItem * backItem = [[UIBarButtonItem alloc] initWithImage:backImage style:UIBarButtonItemStylePlain target:nil action:nil];
navItem.backBarButtonItem = backItem;
[backItem release];

斯科切夫是正确的。在以前版本的SDK中,他们使用了不同的UIButton实例,这允许通过遍历子视图层次结构进行自定义。这已经不可能了。

@DrMickeyLauer 在我的开发环境中,可以迭代层次结构来设置文本颜色。
当您填充
UINavigationBar的
左视图和右视图时,
UINavigationBar
将有
ui按钮
作为子视图。如果您想在导航栏中添加有趣的UIToolbars,您可以遍历navBar.items,检查
UINavigationItems
(via
iskindof类:
)。这些导航项具有左项和右项数组。这些数组包含(除其他外)放置在导航栏左视图和右视图中的工具栏。通过这些左数组和右数组,可以访问工具栏的
uiBarButtonims
。然后,您可以在
UIBarButtonItems
上调用
setTitleTextAttributes
,以设置它们的文本和阴影颜色


但是,正如本·戈特利布所说,这是一种脆弱的方法。它让您怀疑导航栏组织在未来是否会改变

这样做有效,解决了原来的问题(更改导航栏后退按钮-其他工具栏上没有按钮,选项卡栏上没有按钮,等等):


出于好奇:为什么这个问题是社区维基?出于好奇:为什么每个答案都是社区维基?你不应该为后退按钮设置
leftBarButtonItem
——这打破了iOS用户习惯的微调过渡动画:@Yang A)这与我的答案有什么关系?B) 你引用的文章说用户没有注意到动画。A)出于某种原因,我错误地认为你建议为“后退”按钮创建一个自定义栏按钮项,并将其添加为左侧项。我有罪。B) 我当然喜欢——YMMV。对我来说,这是一件小事……@Yang因为OP特别询问了后退按钮,所以从所有这些中可以得到一个很好的澄清。A) 你最初的评论。B) 可以使用一些自定义项设置LeftBarButtonim。有点让我好奇的是,后退按钮动画是否是通过一些属性配置来标记的……这在iOS 5中起作用(最初的问题始于2008年)。准确地说,这还为其他UIBarButtonime设置了文本属性,例如导航栏中的“完成/取消”按钮。UITextAttributeTextColor在ios7中已被删除,而在这种情况下使用NSForegroundColorAttributeName虽然这很聪明,但它并不聪明(例如)在新的iOS版本中更改后退按钮上箭头的颜色。在大多数情况下,人们可能希望箭头和字体颜色匹配。这不仅仅是“聪明”,而是(或曾经是)“正确的”。苹果不断用不向后兼容的更改破坏现有代码,但这是另一个问题:)。这是用iOS 5天写的,所以是的。。。对于iOS 8来说不是很好。
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor blackColor], UITextAttributeTextColor,nil]
         forState:UIControlStateNormal];