2009-12-02 116 views

回答

59

更新:请参阅MANIAK_dobrii's answer以获得更简单的解决方案,可在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]; 
… 
+0

如果你想在您的按钮标题你可能想改变setImage行了setBackgroundImage。如果没有,那么上面的代码工作得很好。 – rein 2009-12-02 20:11:40

+0

非常感谢 – vodkhang 2010-08-26 10:38:03

+3

不要忘记'button.showsTouchWhenHighlighted = YES',这样按钮就会像标准的UIBarButtonItem一样点亮。 – azdev 2011-12-19 03:35:16

7

都能跟得上。正如你可以在Human Interface Guidelines

看你自己的图标的外观决定后,在创建它遵循以下原则:

使用PNG格式。 使用适当的alpha纯白色。 请勿包含阴影。 使用抗锯齿。 如果您决定添加斜角,请确保它是90°(为了帮助您实现此目标,请将光源置于图标顶部)。 对于工具栏和导航栏图标,创建一个大小为20 x 20像素的图标。 对于选项卡栏图标,创建一个大小为30 x 30像素的图标。

注意:您为工具栏,导航栏和选项卡栏提供的图标用作蒙版以创建您在应用程序中看到的图标。 没有必要创建一个全彩图标。

44

还有其他iOS7 +解决方案:从UIImage.h

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

提取物:

...导航栏,标签栏,工具栏和分段控制自动对待自己的前景图像作为模板...您可以使用UIImageRenderingModeAlwaysTemplate强制您的图像始终呈现为模板或UIImageRenderingModeAlwaysOriginal,以强制您的图像始终呈现为原始图像。

+4

这应该是被接受的答案。 – Apfelsaft 2015-11-01 01:42:45

+0

@Apfelsaft - 它可能是,如果iOS 7在2009年存在,当问题被问到:)我已经编辑了接受的答案来链接到这个。 – ToolmakerSteve 2017-03-23 03:28:23

21

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

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

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

Select the image

打开属性检查器中为右侧垂直工具栏上的形象。

Attributes inspector

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

Original Image

即使在故事板上的按钮将继续在原始图像将显示在模拟器中运行时,要与色调的颜色画。

Simulator

用于图像的默认的呈现模式从一个UI控制到另一个而变化。但是,如果在属性检查器上设置此参数,则可以强制使用特定的呈现模式始终表示图像。

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

+0

完美答案! – 2016-05-23 19:00:28

+0

谢谢,这是更清洁 – ekscrypto 2018-01-17 16:21:48

6

在斯威夫特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 
相关问题