IOS/Objective-C:将自定义图像分配给UIBarButtonItem

IOS/Objective-C:将自定义图像分配给UIBarButtonItem,ios,objective-c,uiimage,uibarbuttonitem,Ios,Objective C,Uiimage,Uibarbuttonitem,我能够为UIBarButton项分配一些图像——在InterfaceBuilder中很容易地分配简单的线条图标。但是,当我指定全彩图像时,它会使整个图像成为色调的颜色,默认值为蓝色。如果我将“淡色”设置为“清除颜色”,图像将消失。我无法让它显示图像 我知道可以通过创建UIImageView、制作按钮并将UIImageView指定给按钮来显示图像,但奇怪的是,当其他图像仅通过在IB中指定image属性来正确显示时,您必须为某些图像设置所有这些麻烦 有没有人知道一种方法可以显示彩色图像,而不必经历创

我能够为UIBarButton项分配一些图像——在InterfaceBuilder中很容易地分配简单的线条图标。但是,当我指定全彩图像时,它会使整个图像成为色调的颜色,默认值为蓝色。如果我将“淡色”设置为“清除颜色”,图像将消失。我无法让它显示图像

我知道可以通过创建UIImageView、制作按钮并将UIImageView指定给按钮来显示图像,但奇怪的是,当其他图像仅通过在IB中指定image属性来正确显示时,您必须为某些图像设置所有这些麻烦

有没有人知道一种方法可以显示彩色图像,而不必经历创建视图等繁琐的过程

类似于btnItem.image=@“myimage.png”

我想避免的路很长

UIImageView* v = [[UIImageView alloc] initWithFrame:CGRectMake(4, 0, 36, 36)];

UIImage *myImage = [UIImage imageNamed:@"headshot-32.png"];  

v.image =myImage;
UIImage *scaledImage = [UIImage imageWithCGImage:[myImage CGImage] scale:(35) orientation:(myImage.imageOrientation)];
v.image=scaledImage;
v.layer.cornerRadius = v.frame.size.width / 2;
v.contentMode = UIViewContentModeScaleAspectFill;
v.clipsToBounds = YES;

UIBarButtonItem* roundBtn = [[UIBarButtonItem alloc] initWithCustomView:v];
self.navigationItem.leftBarButtonItems = @[roundBtn];

我会这样做:

 UIButton *b = [UIButton buttonWithType:UIButtonTypeCustom];
 [b setFrame:CGRectMake(0, 0, 36, 36)];
 [b addTarget:self action:@selector(randomMsg) forControlEvents:UIControlEventTouchUpInside];
 [b setImage:[UIImage imageNamed:@"headshot-32.png"] forState:UIControlStateNormal];
 UIBarButtonItem * roundBtn = [[UIBarButtonItem alloc] initWithCustomView:b];
 self.navigationItem.leftBarButtonItems = @[roundBtn];

我会这样做:

 UIButton *b = [UIButton buttonWithType:UIButtonTypeCustom];
 [b setFrame:CGRectMake(0, 0, 36, 36)];
 [b addTarget:self action:@selector(randomMsg) forControlEvents:UIControlEventTouchUpInside];
 [b setImage:[UIImage imageNamed:@"headshot-32.png"] forState:UIControlStateNormal];
 UIBarButtonItem * roundBtn = [[UIBarButtonItem alloc] initWithCustomView:b];
 self.navigationItem.leftBarButtonItems = @[roundBtn];

问题在于渲染模式。创建
UIImage
实例时,其
renderingMode
属性的默认值为
uiimagerrenderingmodeautomatic
。现在,从该渲染模式的开始:

对使用图像的上下文使用默认渲染模式

对于
uiBarButtonim
渲染模式,默认为
UIImageRenderingModeAlwaysTemplate
,它基于源图像的alpha通道创建实际显示的图像

您要做的是将图像的渲染模式更改为
UIImageRenderingModeAlwaysOriginal

UIImage *scaledImage = [UIImage imageWithCGImage:[myImage CGImage] scale:(35) orientation:(myImage.imageOrientation)];
scaledImage.renderingMode = UIImageRenderingModeAlwaysOriginal;
UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithImage:scaledImage
                                           style:UIBarButtonItemStylePlain
                                           target:yourTarget
                                           action:someSelector];

这将确保显示原始图像,而不是从alpha通道创建的图像。

问题在于渲染模式。创建
UIImage
实例时,其
renderingMode
属性的默认值为
uiimagerrenderingmodeautomatic
。现在,从该渲染模式的开始:

对使用图像的上下文使用默认渲染模式

对于
uiBarButtonim
渲染模式,默认为
UIImageRenderingModeAlwaysTemplate
,它基于源图像的alpha通道创建实际显示的图像

您要做的是将图像的渲染模式更改为
UIImageRenderingModeAlwaysOriginal

UIImage *scaledImage = [UIImage imageWithCGImage:[myImage CGImage] scale:(35) orientation:(myImage.imageOrientation)];
scaledImage.renderingMode = UIImageRenderingModeAlwaysOriginal;
UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithImage:scaledImage
                                           style:UIBarButtonItemStylePlain
                                           target:yourTarget
                                           action:someSelector];

这将确保显示原始图像,而不是从alpha通道创建的图像。

好的,做一件事,以编程方式在视图中显示UIBarButtonim

UIButton *ArrowSnapCapture  = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 40 , 35)];
[ArrowSnapCapture setImage:[UIImage imageNamed:@"ArrowIcon"] forState:UIControlStateNormal];
[ArrowSnapCapture addTarget:self action:@selector(CaptureSS) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:Notification];
[self.navigationItem setRightBarButtonItem:rightBarButtonItem];

rightBarButtonItem=nil;

好的,做一件事,让UIBarButtonItem在视图中以编程方式出现

UIButton *ArrowSnapCapture  = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 40 , 35)];
[ArrowSnapCapture setImage:[UIImage imageNamed:@"ArrowIcon"] forState:UIControlStateNormal];
[ArrowSnapCapture addTarget:self action:@selector(CaptureSS) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:Notification];
[self.navigationItem setRightBarButtonItem:rightBarButtonItem];

rightBarButtonItem=nil;

好啊我认为没有办法改变IB中的渲染模式?不是直接改变,但是你可以检查一下,我认为你需要创建一个新的图像,使用alwaysoriginal渲染模式作为。渲染模式属性是readonlyOk。我认为没有办法在IB中更改渲染模式?不是直接更改,但是您可以查看我认为您需要创建一个新图像,将alwaysoriginal渲染模式作为。渲染模式属性为只读