通过IB添加的UIBarButtonItem图标是白色的,通过编程添加时是黑色的。

8

当我通过Interface Builder向UIBarButtonItem添加图标时,图标会以白色显示。但是当我以编程方式将相同的图标文件添加到另一个UIToolbar中时,图标会以黑色显示。为什么?

UIImage *image = [UIImage imageNamed:@"icon.png"];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setImage:image forState:UIControlStateNormal];
rootViewController.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:reloadButton] autorelease];
4个回答

6

答案:如果你想让它变为白色,就把图片变成白色。

详情:

UIBarButtonItems的行为取决于你如何使用它们。

当添加到UIToolbar中时:

initWithImage:style:target:action:创建“白色图标”(忽略图像颜色,不透明像素用作蒙版以创建白色图像)。
这对于borderedplain样式是正确的(但仅在UIToolbar上)。

initWithCustomView:显示普通彩色图像。

当添加到UINavigationItem中时:

initWithImage:style:target:action:创建彩色图像并将plain转换为bordered


谢谢您的回答。我有点困惑;iOS HIGUIBarButtonItem API文档都说明图像仅用作蒙版,通过其alpha值来确定按钮的外观。苹果公司是否记录了实际行为? - Simon Whitaker
(为了澄清:我不是在质疑你的答案,我可以亲眼看到,在我的代码中,你是完全正确的,我已经给你加了一分作为奖励。但是这种行为与苹果自己的文档所述完全不同,所以我自然很好奇是否我错过了什么。) - Simon Whitaker
1
我也很困惑,花了30分钟才搞明白。这就是为什么我发布了我的答案,因为我希望有人会发现它有用。这种行为绝对不是显而易见的,也与文档所述不符。 - bentford

6

Jongsma所说的一切都是正确的,你应该使用initWithImage:style:消息。

下一个问题不是你创建UIBarButtonItem的方式,而是你分配它的位置。您使用UIBarButtonItemStylePlain创建它,这通常应该在白色中呈现图标的轮廓,但是UINavigationItem的rightBarButtonItem(就像leftBarButtonItem一样)不允许UIBarButtonItemStylePlain。它会被隐式转换为UIBarButtonItemStyleBordered。在边框样式中,图标将按原样呈现,即黑色带有轻微的渐变。

我认为,如果您想要在边框barButton上以白色显示项目,则必须触摸图像本身。


但是,当我通过界面构建器添加图像时,为什么图像会以白色显示? - tobiasbayer
你是通过InterfaceBuilder将它添加为rightBarButtonItem吗?当我测试时它显示为黑色。 - tonklon
1
如果使用 UIBarButtonItemStylePlain,图像将显示为白色;如果使用 UIBarButtonItemStyleBordered,则会在其周围出现一个黑色按钮。 - tonklon

0
在你的代码中,你将一个UIButton设置为UIBarButtonItem的子视图。 UIBarButtonItem本身就是一个按钮,所以你不应该再添加另一个按钮作为其子视图。
尝试这样做:
UIImage *image = [UIImage imageNamed:@"icon.png"];
rootViewController.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithImage:image] autorelease];

UIBarButtonItem 不响应 initWithImage:,而是响应 initWithImage:image style:UIBarButtonItemStylePlain target:self action:@selector(action)。然而,图像仍然是黑色而不是白色。 - tobiasbayer
对不起,我确实是这个意思。奇怪... 图像文件的实际颜色是什么? - Pieter Jongsma

0

我遇到了同样的问题。我注意到使用了@2X图像...


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