I want not to change the backgroundColor of an UIImage,
but rather to change the color of the whole image.
Because I have got standard forms which I can move fr
source: https://stackoverflow.com/a/40177870/4488252
extension UIImage {
convenience init?(imageName: String) {
self.init(named: imageName)
accessibilityIdentifier = imageName
}
// https://stackoverflow.com/a/40177870/4488252
func imageWithColor (newColor: UIColor?) -> UIImage? {
if let newColor = newColor {
UIGraphicsBeginImageContextWithOptions(size, false, scale)
let context = UIGraphicsGetCurrentContext()!
context.translateBy(x: 0, y: size.height)
context.scaleBy(x: 1.0, y: -1.0)
context.setBlendMode(.normal)
let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
context.clip(to: rect, mask: cgImage!)
newColor.setFill()
context.fill(rect)
let newImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
newImage.accessibilityIdentifier = accessibilityIdentifier
return newImage
}
if let accessibilityIdentifier = accessibilityIdentifier {
return UIImage(imageName: accessibilityIdentifier)
}
return self
}
}
Usage
let imageView = UIImageView(frame: CGRect(x: 40, y: 250, width: 40, height: 40))
view.addSubview(imageView)
// Set color
imageView.image = UIImage(imageName: "Apple")?.imageWithColor(newColor: UIColor.blue)
// Reset color
//imageView.image = imageView.image?.imageWithColor(newColor: nil)
extension UIImageView {
var imageColor: UIColor? {
set (newValue) {
guard let image = image else { return }
if newValue != nil {
self.image = image.withRenderingMode(.alwaysTemplate)
tintColor = newValue
} else {
self.image = image.withRenderingMode(.alwaysOriginal)
tintColor = UIColor.clear
}
}
get { return tintColor }
}
}
Usage
let imageView = UIImageView(frame: CGRect(x: 40, y: 250, width: 40, height: 40))
view.addSubview(imageView)
imageView.image = UIImage(imageName: "Apple")
// Set color
imageView.imageColor = UIColor.green
// Reset color
//imageView.imageColor = nil
Do not forget to paste here all code which placed above
import UIKit
class ImageView: UIImageView {
enum ImageColorTransformType {
case none, imageExtension, imageViewExtension
}
var imageColorTransformType = ImageColorTransformType.none
}
class ViewController: UIViewController {
weak var colorSwitchButton: UIBarButtonItem?
private var imageViews = [ImageView]()
private var appleImage: UIImage { return UIImage(imageName: "apple")! }
private var redAppleImage: UIImage { return UIImage(imageName: "red_apple")! }
override func viewDidLoad() {
super.viewDidLoad()
createNewImageView(x: 40, y:100, image:appleImage, imageColorTransformType: .none)
createNewImageView(x: 100, y:100, image:appleImage, imageColorTransformType: .imageExtension)
createNewImageView(x: 160, y:100, image:appleImage, imageColorTransformType: .imageViewExtension)
createNewImageView(x: 40, y:160, image:redAppleImage, imageColorTransformType: .none)
createNewImageView(x: 100, y:160, image:redAppleImage, imageColorTransformType: .imageExtension)
createNewImageView(x: 160, y:160, image:redAppleImage, imageColorTransformType: .imageViewExtension)
let buttonItem = UIBarButtonItem(title: "switch", style: .plain, target: self,
action: #selector(colorSwitchButtonTouchedUpInside(_:)))
navigationItem.rightBarButtonItem = buttonItem
colorSwitchButton = buttonItem
useOriginalColors = false
}
private func createNewImageView(x:CGFloat, y: CGFloat, image: UIImage, imageColorTransformType: ImageView.ImageColorTransformType) {
let imageView = ImageView(frame: CGRect(x: x, y: y, width: 40, height: 40))
imageView.image = image
imageView.imageColorTransformType = imageColorTransformType
imageViews.append(imageView)
view.addSubview(imageView)
}
private var _useOriginalColors = false
private var useOriginalColors: Bool {
set(value) {
_useOriginalColors = value
if (value) {
navigationItem.title = "Original colors"
for imageView in imageViews {
switch imageView.imageColorTransformType {
case .imageExtension: imageView.image = imageView.image?.imageWithColor(newColor: nil)
case .imageViewExtension: imageView.imageColor = nil
case .none: break
}
}
} else {
navigationItem.title = "Template colors"
for imageView in imageViews {
switch imageView.imageColorTransformType {
case .imageExtension: imageView.image = imageView.image?.imageWithColor(newColor: UIColor.blue)
case .imageViewExtension: imageView.imageColor = UIColor.green
case .none: break
}
}
}
}
get { return _useOriginalColors }
}
@objc func colorSwitchButtonTouchedUpInside(_ sender: Any) { useOriginalColors = !useOriginalColors }
}