Fill UIImage with UIColor

非 Y 不嫁゛ 提交于 2019-12-22 00:12:48

问题


I have a UIImage that I want to fill with UIColor

I've tried this code but the app crashes on the 10th row.

Here's the code:

extension  UIImage {
    func imageWithColor(_ color: UIColor) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(size, false, scale)
        let context = UIGraphicsGetCurrentContext()
        context?.translateBy(x: 0.0, y: size.height)
        context?.scaleBy(x: 1.0, y: -1.0)
        context?.setBlendMode(CGBlendMode.normal)
        let rect = CGRect(origin: CGPoint.zero, size: size)
        context?.clip(to: rect, mask: context as! CGImage)// crashes
        color.setFill()
        context?.fill(rect)
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        return newImage!
    }
}

The problem is probably on context?.clip(to: rect, mask: context as! CGImage) (I think I shouldn't send context as the mask, but what should I send? Both CGImage() and CGImage.self don't work.


回答1:


You need to end the image context when you finish drawing:

UIGraphicsEndImageContext();

Or you could add a category method for UIImage:

- (UIImage *)imageByTintColor:(UIColor *)color
{
    UIGraphicsBeginImageContextWithOptions(self.size, NO, self.scale);
    CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
    [color set];
    UIRectFill(rect);
    [self drawAtPoint:CGPointMake(0, 0) blendMode:kCGBlendModeDestinationIn alpha:1];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

Using as:

image = [image imageByTintColor:color];



回答2:


You have to do as follow:

extension UIImage {
    func tinted(with color: UIColor) -> UIImage? {
        defer { UIGraphicsEndImageContext() }
        UIGraphicsBeginImageContextWithOptions(size, false, scale)
        color.set()
        withRenderingMode(.alwaysTemplate).draw(in: CGRect(origin: .zero, size: size))
        return UIGraphicsGetImageFromCurrentImageContext()
    }
}



回答3:


Simplest way to doing this

theImageView.image? = (theImageView.image?.imageWithRenderingMode(.AlwaysTemplate))! 
theImageView.tintColor = UIColor.magentaColor()



回答4:


let image = UIImage(named: "whatever.png")?.imageWithRenderingMode(.alwaysTemplate)

When you set this image later to UIButton or UIImageView - just change tint color of that control, and image will be drawn using tint color you specified.



来源:https://stackoverflow.com/questions/39652778/fill-uiimage-with-uicolor

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!