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

时间:2018-05-21 15:36:45

标签: ios objective-c uiimage 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];

3 个答案:

答案 0 :(得分:2)

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

  

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

对于UIImageRenderingModeAutomatic渲染模式,默认为UIBarButtonItem,根据源图像的Alpha通道创建实际显示的图像。

您要做的是将图片的渲染模式更改为UIImageRenderingModeAlwaysTemplate

UIImageRenderingModeAlwaysOriginal

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

答案 1 :(得分:1)

我会做这样的事情:

 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];

答案 2 :(得分:0)

好吧,有一件事在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;