在 UIImageView 上使用 Tint 颜色
Posted
技术标签:
【中文标题】在 UIImageView 上使用 Tint 颜色【英文标题】:Using Tint color on UIImageView 【发布时间】:2014-04-05 21:55:17 【问题描述】:我有自己的UIButton
子类。我在上面添加UIImageView
并添加图像。我想用浅色在图像上绘制它,但它不起作用。
到目前为止我有:
- (id)initWithFrame:(CGRect)frame
self = [super initWithFrame:frame];
if (self)
self.backgroundColor = [UIColor clearColor];
self.clipsToBounds = YES;
self.circleView = [[UIView alloc]init];
self.circleView.backgroundColor = [UIColor whiteColor];
self.circleView.layer.borderColor = [[Color getGraySeparatorColor]CGColor];
self.circleView.layer.borderWidth = 1;
self.circleView.userInteractionEnabled = NO;
self.circleView.translatesAutoresizingMaskIntoConstraints = NO;
[self addSubview:self.circleView];
self.iconView = [[UIImageView alloc]init];
[self.iconView setContentMode:UIViewContentModeScaleAspectFit];
UIImage * image = [UIImage imageNamed:@"more"];
[image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
self.iconView.image = image;
self.iconView.translatesAutoresizingMaskIntoConstraints = NO;
[self.circleView addSubview:self.iconView];
...
并在选择时:
- (void) setSelected:(BOOL)selected
if (selected)
[self.iconView setTintColor:[UIColor redColor]];
[self.circleView setTintColor:[UIColor redColor]];
else
[self.iconView setTintColor:[UIColor blueColor]];
[self.circleView setTintColor:[UIColor blueColor]];
我做错了什么? (图像的颜色始终保持原来的颜色。)
【问题讨论】:
您在创建 iconView 时可以setTintColor
吗?
你的意思是在self.iconView = [UIImageView alloc]之后...?是的,我可以,但它不起作用。
然后使用 CGContext。也许你可以在这里找到你的答案***.com/a/19275079/1790571
是的,我看到了这篇文章,但我真的不明白为什么我的代码不起作用。使用 tint color 是更干净的路径。
【参考方案1】:
代替这段代码:
[image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
你应该有:
image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
在 Swift 4.1
中使用它image = UIImage(named: "name")!.withRenderingMode(.alwaysTemplate)
【讨论】:
不是一个愚蠢的错误,而是一个非常重要的细节。感谢您发布此信息。你刚刚为我节省了很多时间。 (纠正错字) 可以在assets中选择图片,在右侧面板默认渲染模式中选择 太棒了!但是如何恢复到原始的未着色图像? 如果您想获得未着色的图像,您可以:将着色的图像存储在不同的变量中:UIImage image2 = [image imageWithR....],或者您可以再次从文件加载图像:image = [UIImage imageNamed:@"more"]; 我发现 UIImageRenderingModeAlwaysTemplate 有奇怪的问题。如果在 ios 设置 > 显示和亮度中打开“粗体文本”,imageWithRenderingMode: UIImageRenderingModeAlwaysTemplate 会导致内存泄漏(图像数据永远不会被释放)。这可能是系统错误,也可能与其他一些 iOS 设置一起发生。我建议使用 iOS 13 中添加的“func withTintColor(_ color: UIColor) -> UIImage”而不是 .tintColor。【参考方案2】:你也可以在你的资产上设置这个。确保您的图像包含所有白色像素 + 透明。
【讨论】:
我做了所有这些,但由于某种原因 tintColor 对我不起作用。知道我还能尝试什么吗? 您使用的是哪种图像格式?图像全是白色 + alpha 吗? 奇怪的是,在我的前几次运行中,只有 2/3 的图像拾取了色调。清理并构建所有图像后拾取色调。 也许你可以向 Apple 报告? @Banana,这是图像未使用色调的已知问题。不久前我曾向 Apple 报告过,他们将其标记为重复,因此他们肯定知道。解决方法是不要将 UIImageView 设置为 Storyboard 上的图像。所以只要有一个空白的 UIImageView,然后在 viewDidLoad (或其他地方)中设置它,你就会在图像上看到 tintColor。【参考方案3】:(无法编辑@Zhaolong Zhong 的帖子)
在 swift 3.0 中,您可以:
let image = UIImage(named: "your_image_name")!.withRenderingMode(.alwaysTemplate)
yourImageView.image = image
yourImageView.tintColor = UIColor.blue
【讨论】:
【参考方案4】:在 swift 2.0+ 中,您可以:
let image = UIImage(named: "your_image_name")!.imageWithRenderingMode(.AlwaysTemplate)
yourImageView.image = image
yourImageView.tintColor = UIColor.blueColor()
【讨论】:
【参考方案5】:Swift 版本:5.2
let tintableImage = UIImage(named: "myImage")?.withRenderingMode(.alwaysTemplate)
imageView.image = tintableImage
imageView.tintColor = UIColor.red
目标 C
self.imgView.image = [self.imgView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
[self.imgView setTintColor:[UIColor darkGrayColor]];
或者
您也可以在资产上设置此项。
【讨论】:
【参考方案6】:更进一步。这是 UIImageView 的一个插入式子类。 (不是原始问题的确切解决方案。)通过将类名称设置为 TintedImageView 在 Interface Builder 中使用。随着色调颜色的变化,在设计器内部实时更新。
(Swift 3.1,Xcode 8.3)
import UIKit
@IBDesignable class TintedImageView: UIImageView
override func prepareForInterfaceBuilder()
self.configure()
override func awakeFromNib()
super.awakeFromNib()
self.configure()
@IBInspectable override var tintColor: UIColor!
didSet
self.configure()
private func configure()
self.image = self.image?.withRenderingMode(UIImageRenderingMode.alwaysTemplate)
【讨论】:
不工作,但它修改 func 配置为: self.image = self.image?.withRenderingMode(UIImageRenderingMode.alwaysTemplate) let color = super.tintColor super.tintColor = UIColor.clear super.tintColor =颜色【参考方案7】:制作图像视图
let imageView = UIImageView(frame: frame!)
imageView.contentMode = .ScaleAspectFit
imageView.tintColor = tintColor
制作图片
let mainBundle = NSBundle.mainBundle()
var image = UIImage(named: filename!, inBundle: mainBundle, compatibleWithTraitCollection: nil)
image = image?.imageWithRenderingMode(.AlwaysTemplate)
将它们连接在一起
imageView?.image = image
显示它
view.addSubview(imageView)
【讨论】:
【参考方案8】:说的都是对的。我的贡献如果您不能/不想应用于每个 UiImageView,或者为了提高效率,您需要渲染一次(或 tableview 的单元格示例)
func tint(with color: UIColor) -> UIImage
var image = withRenderingMode(.alwaysTemplate)
UIGraphicsBeginImageContextWithOptions(size, false, scale)
color.set()
image.draw(in: CGRect(origin: .zero, size: size))
image = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return image
并将此 UIImage 设置为所有 UI 元素。
【讨论】:
【参考方案9】:@odemolliens 的回答应该可以。
但是,如果您仍然遇到问题,请确保您应用到 UIImageView 的着色颜色与 Interface Builder 中定义的颜色不同。
【讨论】:
以上是关于在 UIImageView 上使用 Tint 颜色的主要内容,如果未能解决你的问题,请参考以下文章
Android 安装包优化Tint 着色器 ( 简介 | 布局文件中的 Tint 着色器基本用法 | 代码中使用 Tint 着色器添加颜色效果 )
使用全局 Tint 颜色作为 UINavigationBars backgroundColor
根据状态更改 UIButton 中 ImageView 的 tint 颜色