[英]UIImageView template image tint color changes on UITableViewCell click
[英]Using Tint color on UIImageView
我有自己的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]];
}
}
我做错了什么? (图像的颜色始终保持原来的颜色。)
而不是这个代码:
[image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
你应该有:
image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
在Swift 4.1 中使用它
image = UIImage(named: "name")!.withRenderingMode(.alwaysTemplate)
(无法编辑@Zhaolong Zhong 帖子)
在 swift 3.0 中,您可以执行以下操作:
let image = UIImage(named: "your_image_name")!.withRenderingMode(.alwaysTemplate)
yourImageView.image = image
yourImageView.tintColor = UIColor.blue
在 swift 2.0+ 中,您可以执行以下操作:
let image = UIImage(named: "your_image_name")!.imageWithRenderingMode(.AlwaysTemplate)
yourImageView.image = image
yourImageView.tintColor = UIColor.blueColor()
斯威夫特版本: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]];
或者
您也可以在您的资产上设置它。
更进一步。 这是 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)
}
}
制作图像视图
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)
说的都是对的。 我的贡献如果你不能/不想应用到每个 UiImageView,或者为了效率你需要渲染一次(或者例如 tableviews 的单元格)
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 元素。
@odemolliens 的答案应该可以正常工作。
但是,如果您仍然遇到问题,请确保您应用到 UIImageView 的色调颜色与 Interface Builder 中定义的颜色不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.