首页 > 解决方案 > IOS/Objective-C:将自定义图像分配给 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];

标签: iosobjective-cuiimageuibarbuttonitem

解决方案


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

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

对于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 通道创建的图像。


推荐阅读