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

IOS/Objective-C: Assign custom image to UIBarButtonItem

我可以将一些图像分配给 UIBarButton 项——在 InterfaceBuilder 中很容易使用简单的线条图标。但是,当我分配一个全彩色图像时,它会使整个图像成为色调的颜色,默认值为蓝色。如果我将色调设置为清晰的颜色,图像就会消失。我无法让它显示图像。

我知道可以通过创建一个 UIImageView、创建一个按钮并将 UIImageView 分配给该按钮来显示一个图像,但是对于某些图像,您必须如此麻烦,而对于其他图像,这似乎很奇怪只需在 IB 中分配图像 属性 即可正确显示。

有没有人知道一种方法来显示彩色图像,而无需经历创建视图等整个过程

类似于 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];

渲染模式有问题。创建 UIImage 的实例时,其 renderingMode 属性 的默认值为 UIImageRenderingModeAutomatic。现在,从这个渲染模式的documentation

Use the default rendering mode for the context where the image is used.

对于 UIBarButtonItem 渲染模式默认为 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 通道创建的图像。

好吧,在 viewWillAppear 中以编程方式制作 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;