2010-07-21 145 views
54

我想知道如何将图像设置为UIBarButtonItem,然后通过在创建UIBarButtonItem时使用InitWithImage将其添加到UIToolbar。使用initWithImage将图像添加到UIBarButtonItem中:(UIImage *)image

我做以下,但它会创建一个空白的空格在图像应在UIToolbar

UIImage *image = [UIImage imageNamed:@"6.png"]; 

UIBarButtonItem *systemItem1 = [[UIBarButtonItem alloc] initWithImage:image style:UIBarButtonItemStylePlain target:self action:@selector(pp:)]; 

谢谢!

+0

你能NSLog的图像,以确保它不是零 – vodkhang 2010-07-21 15:11:45

+1

图像不为零,我有图像添加到一个UIImageView并将其显示在屏幕上。 任何人都可以验证是否有与UIBarButtonItem一起使用的特殊类型的.png格式? – 2010-07-22 06:44:53

+0

@ShumaisUlHaq似乎这个问题需要一个最好的答案。请看一看。 – Vahan 2016-02-22 18:11:16

回答

40

我会尝试设置

UIBarButtonItem *systemItem1 = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"image.png"] style:UIBarButtonItemStylePlain target:self action:@selector(pp:)]; 
+2

为什么这不是最高职位? – John 2015-04-06 08:57:20

+0

为什么这会得到这么多upvotes? – jakedunc 2015-10-05 17:30:57

+0

我错过了什么吗?在问题和这篇文章中的代码没有区别? – 2018-03-07 07:23:25

0

我太有这个问题,并通过使用PNG文件带有alpha通道解决它。 我试图做一个快速样机,并在背景上添加一个带有jpg文件的后退按钮,默认颜色为按钮。我有一个白色的矩形。但是当我在透明背景上创建一个箭头并将其保存为png文件时,它工作正常。

69

下面是一个从Facebook徽标创建工具栏按钮的示例。 创建一个指向图像的指针(已添加到xCode的文件),创建一个自定义按钮,更改按钮的大小以匹配图像,设置按钮图像,从按钮视图创建工具栏按钮。

UIImage *faceImage = [UIImage imageNamed:@"facebook.png"]; 
UIButton *face = [UIButton buttonWithType:UIButtonTypeCustom]; 
face.bounds = CGRectMake(0, 0, faceImage.size.width, faceImage.size.height); 
[face setImage:faceImage forState:UIControlStateNormal]; 
UIBarButtonItem *faceBtn = [[UIBarButtonItem alloc] initWithCustomView:face]; 
+0

感谢,它对我的​​工作很好,我会建议使用这个代码 – ravinder521986 2013-05-04 19:17:48

+3

它的好,甚至更好,如果你想添加目标动作到这个按钮..这[面对addTarget:自我行动︰@selector(faceBtnPressed)forControlEvents:UIControlEventTouchUpInside ] – AmJa 2015-04-10 19:39:00

17

documentation of UIBarButtonItem

的栏上显示的图像被从该图像的。如果此图像太大而无法放在条上,则会缩放以适合该条。通常,工具栏和导航栏图像的大小为20 x 20点。源图像中的alpha值用于创建图像 - 不透明值将被忽略。

换句话说,该UIBarButton项目会忽略图像的颜色,并根据当前栏样式重新着色它。它将显示图像的唯一方法是如果图像是使用不同的alpha值绘制的。由于图像的所有像素都具有1的alpha值,因此它们都以最大亮度绘制,并且会得到一个空白区域。

+0

看看我的两个解决方案,他们解决了这个问题。 – 2015-07-05 21:25:05

0

UIBarbuttonItem initWithImage不会使用指定的Image创建一个栏按钮。 它使用给定的图像创建一个UIBarbutton模式。如果指定的图像不透明,它会显示一个带有指定tintcolor的酒吧按钮,它具有图像的大小。 如果图像具有不透明的部分,那么色调颜色将填充在不透明的部分,如默认的UIBarButtonSystemItemBookmarks.It不透明的边框和透明的内侧。

在你的情况下,titncolor是白色的,这就是为什么它显示白色。

56

而且适用于iOS 7+您执行以下操作:

Objective-C的

UIImage *image = [[UIImage imageNamed:@"myImage.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 
UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithImage:image style:UIBarButtonItemStylePlain target:self action:@selector(YOUR_METHOD:)]; 

雨燕2.3

let image = UIImage(named: "myImage")?.imageWithRenderingMode(.AlwaysOriginal) 
let button = UIBarButtonItem(image: image, style: .Plain, target: self, action: #selector(YOUR_METHOD(_:))) 

斯威夫特3。0

let image = UIImage(named: "myImage")?.withRenderingMode(.alwaysOriginal) 
let button = UIBarButtonItem(image: image, style: .plain, target: self, action: #selector(YOUR_METHOD(_:))) 
+0

这个工程。确保设置按钮尺寸属性... – 2015-06-25 12:37:55

+2

这修复了我的错误。谁能解释为什么这是必要的? – 2015-08-04 12:09:53

+1

我尝试了一切,这是唯一可行的解​​决方案。 – Paul 2015-11-13 20:31:56

0

你做我会写相同的代码。请注意,当您将图片添加到项目中时,请确保将其添加到您正在构建的目标中。

1

后您创建栏按钮项目下一步:

systemItem1.image = [systemItem1.image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 
9

斯威夫特

首先解决

let img = UIImage(named: "picture")!.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal) 
let leftBarButtonItem = UIBarButtonItem(image: img, style: UIBarButtonItemStyle.Plain, target: self, action: nil) 
self.navigationItem.leftBarButtonItem = leftBarButtonItem 

解决方法二

let img = UIImage(named: "picture")! 
let imgWidth = img.size.width 
let imgHeight = img.size.height 
let button = UIButton(frame: CGRect(x: 0, y: 0, width: imgWidth, height: imgHeight)) 
button.setBackgroundImage(img, forState: .Normal) 
button.addTarget(self, action: nil, forControlEvents: UIControlEvents.TouchUpInside) 
self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: button)