ios - 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];
解决方案
问题是渲染模式。创建 的实例时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 通道创建的图像。
推荐阅读
- objective-c - [NSKeyedArchiver archivedDataWithRootObject:在目标 c 上崩溃
- javascript - 如何使用 jquery 在页面加载时生成动态下拉列表?
- express - 在浏览器端缓存 Express REST 路由
- java - AttributeConverter convertToEntityAttribute 循环记录并总是得到空值?
- javascript - 如何从 lodash 获取对象值?
- c# - 空引用在 C# 中基本上是全零指针吗?
- php - 推荐短代码也显示在我的网站上?如何避免这个问题
- java - 当 http 连接超时时为 TextView 设置文本
- python - 将多个唯一表单关联到 Django 中的唯一对象
- java - 批量阅读 Couchbase 文档