使用 UIAppearance API 自定义 UIBarButtonSystemItem 的色调颜色

Posted

技术标签:

【中文标题】使用 UIAppearance API 自定义 UIBarButtonSystemItem 的色调颜色【英文标题】:Customizing tint color of UIBarButtonSystemItem with UIAppearance API 【发布时间】:2013-02-21 16:51:41 【问题描述】:

我知道我可以通过以下方式自定义UIBarButtonItem 文本

setTitleTextAttributes:forState:

还有一种方法可以自定义UITabBar图标通过

setSelectedImageTintColor:

有没有办法自定义UIBarButtonSystemItem 的色调(例如垃圾桶图标颜色),只是为了获得一致的用户体验?我找不到任何东西。

如果这不可能,我将如何进行?我应该保存图标的颜色修改版本吗?我在哪里可以找到它?修改它的最简单方法是什么?

编辑

澄清一下,我要求的不是UIBarButtonItem的背景颜色,而是图标轮廓的颜色。

编辑

设置UIBarButtonItem 的色调颜色会生成按钮集的背景颜色。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];


    [[UINavigationBar appearance] setTintColor:[UIColor greenColor]];

    UIBarButtonItem* trashButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemTrash target:nil action:nil];

    trashButton.tintColor = [UIColor blackColor];
    UIViewController* viewController = [[UIViewController alloc] init];
    UINavigationController* navController = [[UINavigationController alloc] initWithRootViewController:viewController];
    [viewController.navigationItem setRightBarButtonItem:trashButton];

    self.window.rootViewController = navController;
    return YES;

产生this。

编辑 2

事实证明,系统图标的轮廓颜色实际上可以通过UIBarButtonItemtintColor属性设置,但前提是其style属性的值为UIBarButtonItemStylePlain。 (即便如此,有些颜色是特殊的,并且使轮廓保持白色。一种这样的颜色是[UIColor blackColor])但是,在UINavigationBar 中使用UIBarButtonItemstyle 被强制为UIBarButtonItemStyleBordered。在这种情况下,tintColor 设置按钮的背景颜色并将轮廓保留为白色。

当我在导航栏中使用UIBarButtonItems 时,我的问题仍未解决。

【问题讨论】:

【参考方案1】:

注意:以下仅适用于添加到工具栏的按钮,不适用于导航栏。

使用UIBarButtonItemtintColor 属性。要么在特定实例上调用它,要么在所有按钮项的 appearance 上调用它。

请注意通过appearance 设置所有按钮项的色调。设置色调时,并非所有按钮项看起来都正确。

更新:

UIBarButtonItem *btnAdd = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addAction)];
btnAdd.tintColor = [UIColor blackColor];

这将使按钮的图标变黑(背景将是工具栏的色调)。

【讨论】:

感谢您的及时答复。正如我所怀疑的,这会改变 barButton 的背景颜色。说,我的导航栏是绿色的,按钮背景也是绿色的,我想显示黑色文本,UIBarButtonSystemItems 在绿色背景上也是黑色的,我该如何实现?我唯一的问题是UIBarButtonSystemItem 的黑色,默认为白色,我无法修改。 我在我的应用程序中执行此操作。对于系统类型栏按钮项目之一,我设置了按钮的 tintColor。这只会更改图标的颜色。我对添加到工具栏的条形按钮项执行此操作。 刚试了又试了又试了。使用 ios 6.1 SDK。将色调设置为黑色我得到一个黑色背景上的白色垃圾桶。我需要一个绿色背景上的黑色罐子。 我刚刚验证了我发布的代码对于更改图标的颜色是正确的,而不是按钮的背景。确保注释掉所有其他 UIBarButtonItem appearance 代码,并在单个按钮上仅尝试 tintColor 好的,我明白了。我已经说过我的解决方案是针对工具栏的。您更新的代码显示您将栏按钮项放在导航栏中。我需要看看这是否会有所作为。【参考方案2】:

我通过在外部编辑器中更改条形按钮系统项 png 文件的颜色解决了我的问题,包括该图像到项目并通过加载它

[[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"UIButtonBarTrashBlack"] style:UIBarButtonItemStyleBordered target:self action:@selector(myAction)];

我使用有用的UIKit-Artwork-Extractor 找到了内部系统映像。

我使用免费软件GIMP编辑了艺术品的颜色。

【讨论】:

非常感谢您提供这个有用的答案!这确实似乎是最简单的方法。 太糟糕了,你不能在 UINavigationBar 中设置 UIBarButtonItem 的宽度 :( 现在按钮看起来不像系统项。【参考方案3】:

不要使用黑色,而是使用这个:

[UIColor colorWithRed:0 green:0 blue:0 alpha:1]; // [UI颜色 blackColor] 使其变为白色

【讨论】:

没有评论就失望了?很有用

以上是关于使用 UIAppearance API 自定义 UIBarButtonSystemItem 的色调颜色的主要内容,如果未能解决你的问题,请参考以下文章

使用 UIAppearance 代理自定义字体时,MFMailComposeViewController 不起作用

使用 UIAppearance 渲染图像

与自定义视图控制器一起使用时,UINavigationBar 的 UIAppearance 不起作用...?

检测自定义按钮的 UIAppearance 代理中的更改

UIAppearance

我啥时候可以开始使用使用 UIAppearance 设置的属性?