the details
- Xcode 10.2.1 (10E1001), Swift 5
Method 1: Extend UIImage
source: stack overflow
extension UIImage { convenience init?(imageName: String) { self.init(named: imageName) accessibilityIdentifier = imageName } // /questions/110361/change-color-of-png-in-buttons-ios/688577
using
let imageView = UIImageView(frame: CGRect(x: 40, y: 250, width: 40, height: 40)) view.addSubview(imageView)
Method 2. Extending UIImageView
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 } } }
using
let imageView = UIImageView(frame: CGRect(x: 40, y: 250, width: 40, height: 40)) view.addSubview(imageView) imageView.image = UIImage(imageName: "Apple")
Full sample
Do not forget to insert all the code 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 } }
Storyboard

Result
