如何通过外观协议设置UIBarButtonItem的tintColor?

4
我正在尝试通过编程的方式设置整个项目中UIBarButtonItemtintColor。我调用了:[UIBarButtonItem appearance]。但是,在查看苹果文档http://developer.apple.com/library/ios/#documentation/uikit/reference/UIBarButtonItem_Class/Reference/Reference.html后,没有找到设置tintColor的属性。我找到的最相关方法是:
setBackgroundImage:forState:barMetrics:
setBackgroundImage:forState:style:barMetrics:

然而,这两种方法都用于设置实际背景图片。是否可以通过UIAppearance仅设置按钮的tintColor

2个回答

10

也许我没有正确理解问题。但是如果你查看你发布的链接,在任务->自定义外观下,有一个属性叫做tintColor。

你只需将该属性设置为所需的颜色即可。

[[UIBarButtonItem appearance] setTintColor:[UIColor redColor]];

这对你不起作用吗?


我明白了,但是您如何针对不同风格或状态的按钮进行定位?例如,一个有状态(UIControlStateDisabled)和样式(UIBarButtonItemStyleDone)的按钮,似乎没有提供必要的样式方法。通常情况下,完成按钮与标准工具栏按钮具有不同的色调。 - Jim Jeffers
好的,UIAppearance协议并不是那么灵活,最多只能使用appearanceWhenContainedIn:方法来提供更具体的目标(例如,在特定控制器内的特定工具栏)来着色,但如果您需要为按钮状态使用单独的样式,则必须坚持使用自定义图像。 - Dhruv Goel
它在iOS 5和iOS 6版本上运行良好,但在iOS 7上不行。 在iOS 7中,它会抛出异常: 由于未捕获的异常“NSInvalidArgumentException”,终止应用程序,原因是:“-setTintColor:不允许在UINavigationButton的外观代理上使用。” - srikanth rongali

4
根据UIAppearance协议,您可以按以下方式设置tintColor:

要自定义类的实例在容器类的实例中包含时或层次结构中的实例的外观,您可以使用 appearanceWhenContainedIn: 获取该类的外观代理。

[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil]
       setTintColor:myNavBarColor];

如果这是你所需要的,这里有提到关于UI Appearance的相关内容。


谢谢。不过我应该更清楚一些——如何为特定的样式UIBarButtonItemStyleDone或控件状态UIControlStateDisabled设置色调颜色? - Jim Jeffers
不确定这个程序要做什么,但是你可以通过为UIBarButton项编写一个类别来增加灵活性,该类别基本上会将颜色和状态作为输入,并且您可以手动从该颜色创建UIImage,然后使用以下方法:
  • (void)setBackgroundImage:(UIImage *)backgroundImage forState:(UIControlState)state barMetrics:(UIBarMetrics)barMetrics
- Bikramjit Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接