36

我有一张想在 UIBarButtonItem 上显示的图像,但由于某种原因,它只显示了它的轮廓,其余的都是白色的。我怎样才能让它实际显示图像?

谢谢!

4

5 回答 5

66

还有其他 iOS7+ 解决方案:

NSString *iconFilename = // ...
UIImage *image = 
    [[UIImage imageNamed:iconFilename] 
        imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
UIBarButtonItem *barButtonItem = 
    [[UIBarButtonItem alloc] initWithImage:image
                                     style:UIBarButtonItemStylePlain 
                                    target:self 
                                    action:@selector(onBarButtonItemTapped:)];

斯威夫特 5:

let iconFilename: String = // ...
let image = UIImage(named: iconFilename)?.withRenderingMode(.alwaysOriginal)
let barButtonItem = UIBarButtonItem(image: image, 
                                    style: .plain, 
                                    target: self, 
                                    action: #selector(onBarButtonItemTapped(_:)))

从 UIImage.h 中提取:

...导航栏、标签栏、工具栏和分段控件自动将其前景图像视为模板...您可以使用 UIImageRenderingModeAlwaysTemplate 强制您的图像始终呈现为模板或 UIImageRenderingModeAlwaysOriginal 强制您的图像始终呈现为原件。

于 2014-12-24T16:31:21.160 回答
65

更新:请参阅MANIAK_dobrii 的答案以获得更简单的解决方案,在 iOS 7+ 中可用。


这是我如何为 UIBarButtonItem 使用图像:

UIImage *image = [UIImage imageNamed:@"buttonImage.png"];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.bounds = CGRectMake( 0, 0, image.size.width, image.size.height );    
[button setImage:image forState:UIControlStateNormal];
[button addTarget:myTarget action:@selector(myAction) forControlEvents:UIControlEventTouchUpInside];    
UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button];
…
于 2009-12-02T19:44:21.337 回答
44

还有另一种根本不涉及编码的方法。

首先,将要放置的图像放在 Assets.xcassets 文档的栏上。

在资产浏览器上选择图像。

选择图片

在右侧垂直工具栏上打开该图像的属性检查器。

属性检查器

在“渲染为”上选择“原始图像”。

原始图像

即使在情节提要上,按钮将继续使用淡色绘制,但在模拟器上运行时,将显示原始图像。

模拟器

图像的默认渲染模式因一个 UI 控件而异。但是,如果您在属性检查器上设置此参数,您可以强制图像始终以特定的渲染模式表示。

如果您需要在不同的控制器上使用不同的渲染模式来表示相同的图像,那么来自 MANIAK_dobrii 的响应更合适。

于 2016-05-14T10:08:21.140 回答
11

在斯威夫特 3 中:

let iconname = // ...
let image = UIImage(named: iconname)?.withRenderingMode(.alwaysOriginal)
let barButtonItem = UIBarButtonItem(image: image, style: .plain, target: self, action: #selector(self. onBarButtonItemTapped))
self.navigationItem.leftBarButtonItem = barButtonItem
于 2016-12-09T09:31:13.333 回答
7

没有。正如您在人机界面指南中所读到的那样

确定图标的外观后,请在创建图标时遵循以下准则:

使用 PNG 格式。使用带有适当 alpha 的纯白色。不包括投影。使用抗锯齿。如果您决定添加一个斜角,请确保它是 90°(为了帮助您做到这一点,想象一个位于图标顶部的光源)。对于工具栏和导航栏图标,创建一个大小约为 20 x 20 像素的图标。对于标签栏图标,创建一个大小约为 30 x 30 像素的图标。

注意:您为工具栏、导航栏和标签栏提供的图标用作掩码来创建您在应用程序中看到的图标。没有必要创建全彩图标。

于 2009-12-02T19:44:53.270 回答