【问题标题】:How can I customize the text color of the back button in a UINavigationController header view?如何在 UINavigationController 标题视图中自定义后退按钮的文本颜色?
【发布时间】:2012-12-13 23:28:20
【问题描述】:

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

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

自定义视图并没有坚持下去,而且我没有看到任何明显简单的方法来获取默认按钮内的实际文本并开始更改其样式。

【问题讨论】:

  • 出于好奇:为什么这个问题是社区 wiki?
  • 出于好奇:为什么每个答案社区都是 wiki?

标签: iphone cocoa-touch


【解决方案1】:

这有效,解决了原始问题(更改导航栏 BACK 按钮 - 其他工具栏上没有按钮,标签栏上没有按钮等):

[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor blackColor], UITextAttributeTextColor,nil]
         forState:UIControlStateNormal];

【讨论】:

  • 这适用于 iOS 5(原始问题可追溯到 2008 年)。准确地说,这也设置了其他 UIBarButtonItems 的文本属性,例如导航栏中的完成/取消按钮。
  • UITextAttributeTextColor 在 ios7 中已被弃用,在这种情况下使用 NSForegroundColorAttributeName
  • 虽然这很聪明,但它不会(例如)改变新 iOS 版本中后退按钮上的 箭头 的颜色。在大多数情况下,人们可能希望箭头和字体颜色匹配。
  • 这不仅仅是“聪明”,而是(或曾经)“正确”。 Apple 不断通过不向后兼容的更改破坏现有代码,但这是一个单独的问题 :)。这是在 iOS 5 天编写的,所以是的……对于 iOS 8 来说不是很好。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        但是,正如 Ben Gottlieb 所说,这是一种脆弱的方法。它让您想知道导航栏组织将来是否会改变。

        【讨论】:

        • 你不应该为返回按钮设置leftBarButtonItem——这破坏了iOS用户习惯的微调过渡动画:watchingapple.com/2009/11/…
        • @Yang A) 这与我的回答有什么关系? B)您引用的文章指出用户没有注意到动画。
        • A) 出于某种原因,我错误地认为您建议为后退按钮创建一个自定义栏按钮项并将其添加为左侧项。过失。 B)我当然愿意——YMMV。对我来说,这是其中一件小事……
        • @Yang 由于 OP 专门询问后退按钮,因此可以从所有这些中做出很好的说明。 A)您的原始评论。 B)有一些替代设置 leftBarButtonItem 与一些自定义项目。有点让我好奇是否通过某些属性配置标记了后退按钮动画...
        猜你喜欢
        • 2010-11-29
        • 1970-01-01
        • 1970-01-01
        • 2011-03-31
        • 1970-01-01
        • 1970-01-01
        • 2013-01-20
        • 1970-01-01
        • 2010-11-23
        相关资源
        最近更新 更多