【问题标题】:Using Tint color on UIImageView在 UIImageView 上使用 Tint 颜色
【发布时间】: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。也许你可以在这里找到你的答案stackoverflow.com/a/19275079/1790571
  • 是的,我看到了这篇文章,但我真的不明白为什么我的代码不起作用。使用 tint color 是更干净的路径。

标签: ios xcode uiimageview uibutton tintcolor


【解决方案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 中定义的颜色不同。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-10-30
              • 2015-11-11
              • 1970-01-01
              • 2011-06-29
              • 2020-04-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多