Как изменить tintColor изображения в iOS и WatchKit

У меня есть UIImageView под названием «theImageView» с UIImage одного цвета (прозрачный фон), как левое черное сердце ниже. Как я могу программно изменить цвет оттенка этого изображения в iOS 7 или более поздней версии в соответствии с методом оттенка, используемым в значках панели навигации iOS 7+?

Может ли этот метод работать в WatchKit для приложения Apple Watch?

введите описание изображения здесь


person chewy    schedule 09.10.2013    source источник
comment
Что вы имеете в виду, что следующий код неверен, установка UIImage с UIImageRenderingModeAlwaysTemplate, а затем установка UIImageVIew tintColor ДЕЙСТВИТЕЛЬНО работают. (в моем коде ^^)   -  person Vinzzz    schedule 09.10.2013
comment
Используйте png с прозрачностью например этот   -  person Alladinian    schedule 09.10.2013
comment
Вам действительно стоит переместить свой ответ в раздел ответов, так как я считаю его лучшим и самым современным.   -  person Richard Venable    schedule 02.10.2014


Ответы (24)


iOS
для приложения iOS в Swift 3, 4 или 5:

theImageView.image = theImageView.image?.withRenderingMode(.alwaysTemplate)
theImageView.tintColor = UIColor.red

Для Swift 2:

theImageView.image = theImageView.image?.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate)
theImageView.tintColor = UIColor.redColor()

Между тем современное решение Objective-C:

theImageView.image = [theImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
[theImageView setTintColor:[UIColor redColor]];

Watchkit
В WatchKit для приложений Apple Watch вы можете установить цвет оттенка для изображения шаблона.

  1. Вы должны добавить свое изображение в каталог активов в вашем приложении WatchKit и настроить изображение, которое будет отображаться как изображение шаблона в инспекторе атрибутов. В отличие от приложения для iPhone, в настоящее время вы не можете установить рендеринг шаблона в коде в WatchKit Extension.
  2. Установите это изображение для использования в WKInterfaceImage в построителе интерфейса для вашего приложения.
  3. Создайте IBOutlet в своем WKInterfaceController для WKInterfaceImage под названием 'theImage' ...

Чтобы затем установить цвет оттенка в Swift 3 или 4:

theImage.setTintColor(UIColor.red)

Swift 2:

theImage.setTintColor(UIColor.redColor())

Чтобы затем установить цвет оттенка в Objective-C:

[self.theImage setTintColor:[UIColor redColor]];

Если вы используете шаблонное изображение и не применяете оттенок, будет применен глобальный оттенок для вашего приложения WatchKit. Если вы не установили глобальный оттенок, theImage по умолчанию будет окрашен в голубой цвет при использовании в качестве изображения шаблона.

person Duncan Babbage    schedule 18.10.2014
comment
это лучшее и простое решение. - person Ankish Jain; 17.11.2014
comment
imageWithRenderingMode работает слишком медленно. В раскадровке и изображениях. вы также можете изменить эти два: Обновите режим рендеринга на изображение шаблона - это лучшее решение - person Katerina; 16.10.2015
comment
Отлично, теперь я использую этот метод, основанный на вашем коде: + (UIImageView ) tintImageView: (UIImageView *) imageView withColor: (UIColor) color {imageView.image = [imageView.image imageWithRenderingMode: UIImageRenderingModeAlwaysTemplate]; [imageView setTintColor: цвет]; return imageView; } - person Josep Escobar; 06.06.2016
comment
лучше с изображением черного цвета? - person Bruno; 30.06.2016
comment
Мне пришлось настроить изображение в каталоге активов для рендеринга в качестве шаблона, чтобы оно работало на iOS. - person duncanc4; 25.11.2016
comment
Изображение @Bruno не обязательно должно быть черным, нет. Работает с любым цветом. - person Duncan Babbage; 17.05.2017
comment
Я бы просто избегал принудительного разворачивания необязательного и просто использовал необязательную цепочку: theImageView.image = theImageView.image? .WithRenderingMode (.alwaysTemplate) - person prolfe; 08.10.2018
comment
работает с любым цветом, кроме черного? что происходит? @@ - person Anonymous-E; 04.12.2018
comment
Хм. Звучит не так, @SopheakSok. Когда вы говорите, что это не работает, что конкретно вы видите? - person Duncan Babbage; 05.12.2018
comment
@DuncanBabbage Я действительно не знаю, почему это было так, я пытался изменить цвет на голубой, красный, синий, зеленый ... он работает нормально, но когда я попробовал черный цвет, оттенок изображения стал белым. поэтому я попробовал метод fuzz ниже, он использует эту функцию как расширение, и сейчас она работает. - person Anonymous-E; 06.12.2018

Вот категория, которая должна помочь

@interface UIImage(Overlay)
@end

@implementation UIImage(Overlay)

- (UIImage *)imageWithColor:(UIColor *)color1
{
        UIGraphicsBeginImageContextWithOptions(self.size, NO, self.scale);
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextTranslateCTM(context, 0, self.size.height);
        CGContextScaleCTM(context, 1.0, -1.0);
        CGContextSetBlendMode(context, kCGBlendModeNormal);
        CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
        CGContextClipToMask(context, rect, self.CGImage);
        [color1 setFill];
        CGContextFillRect(context, rect);
        UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return newImage;
}
@end

так что вы бы сделали:

theImageView.image = [theImageView.image imageWithColor:[UIColor redColor]];
person iamamused    schedule 09.10.2013
comment
Спасибо за этот очень правильный ответ, я думаю, мой код был в порядке с самого начала, я должен ответить на свой вопрос и дал вам +1, несмотря ни на что ... - person chewy; 09.10.2013

Мне пришлось сделать это в Swift, используя extension.

Думал рассказать, как у меня это получилось:

extension UIImage {
    func imageWithColor(color1: UIColor) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
        color1.setFill()

        let context = UIGraphicsGetCurrentContext() as CGContextRef
        CGContextTranslateCTM(context, 0, self.size.height)
        CGContextScaleCTM(context, 1.0, -1.0);
        CGContextSetBlendMode(context, CGBlendMode.Normal)

        let rect = CGRectMake(0, 0, self.size.width, self.size.height) as CGRect
        CGContextClipToMask(context, rect, self.CGImage)
        CGContextFillRect(context, rect)

        let newImage = UIGraphicsGetImageFromCurrentImageContext() as UIImage
        UIGraphicsEndImageContext()

        return newImage
    }
}

Использование:

theImageView.image = theImageView.image.imageWithColor(UIColor.redColor())

Swift 4

extension UIImage {
    func imageWithColor(color1: UIColor) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
        color1.setFill()

        let context = UIGraphicsGetCurrentContext()
        context?.translateBy(x: 0, y: self.size.height)
        context?.scaleBy(x: 1.0, y: -1.0)
        context?.setBlendMode(CGBlendMode.normal)

        let rect = CGRect(origin: .zero, size: CGSize(width: self.size.width, height: self.size.height))
        context?.clip(to: rect, mask: self.cgImage!)
        context?.fill(rect)

        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return newImage!
    }
}

Использование:

theImageView.image = theImageView.image?.imageWithColor(color1: UIColor.red)

person fulvio    schedule 03.07.2014
comment
К вашему сведению, это не сработало для меня, пока я не переместил color1.setFill() прямо под первой строкой в ​​методе UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale). - person Aaron; 25.06.2015
comment
@Aaron Обновлено на основе вашего комментария. Спасибо. - person fulvio; 26.06.2015
comment
Use of unresolved identifier "kCGBlendModeNormal" - Ошибка в Xcode 7.0 beta 2 - person Cesare; 04.07.2015
comment
@CeceXX используйте CGBlendMode.Normal вместо - person Adolfo; 24.07.2015
comment
В watchKit должен ли возвращаемый тип по-прежнему быть UIImage? В моем расширении нет ошибок, но когда я вызываю функцию theImageView.image = theImageView.image.imageWithColor(UIColor.redColor()) в своем пользовательском VC, я не могу писать theImageView.image....... Автозаполнения нет. Конечно, я импортировал Foundation и WatchKit. Это внутри awakeWithContext. Нигде я пишу imageView не работает. - person Edison; 22.03.2016
comment
Вы великолепны, но вам, возможно, придется сменить его на Swift 3 - person SimpuMind; 26.02.2017
comment
@SimpiMind вместо этого предоставил Swift 4. - person fulvio; 27.04.2018
comment
Спустя много лет я вернулся к этому ответу и отключился, я уже проголосовал! Не могу дать вам большего! - person Reimond Hill; 11.02.2020
comment
Что означает эта ошибка Значение типа "UIColor" не имеет элемента "scale" - person Kurt Lane; 27.06.2021

В раскадровке и изображениях. вы также можете изменить эти два:

Обновите режим рендеринга на изображение шаблона

Обновите режим рендеринга  в изображение шаблона в изображениях

Обновите цвет оттенка в видах.

Обновление цвета оттенка  in Просмотры в просмотрах

person JerryZhou    schedule 09.09.2015
comment
Это действительно самый крутой ответ! - person brandonscript; 20.01.2016
comment
Эй, это прекрасно работает в моем статическом контроллере tableview без необходимости писать какой-либо код. - person Rick; 26.04.2016
comment
Спасибо за отличный ответ! Как ни странно, у меня это не работает - я просто получаю простую панель того цвета, который я выбрал в качестве оттенка. Какой цвет там выбрать в качестве оттенка? Благодарность... - person Fattie; 09.06.2016
comment
@JoeBlow, что вы включаете в детали простой панели? - person JerryZhou; 14.06.2016
comment
У меня никогда не работает установка этого значения из раскадровки. Мне всегда приходится использовать imageView.tintColor из кода. - person Kamil Powałowski; 07.09.2016
comment
@ KamilPowałowski, вы устанавливаете оба значения в режиме просмотра изображений и изображений? - person JerryZhou; 18.09.2016
comment
@JerryZhou, конечно. Единственная разница в том, что я использую изображения из PDF-файлов, поэтому я также устанавливаю коэффициент масштабирования в UIImage. - person Kamil Powałowski; 18.09.2016
comment
@ KamilPowałowski Масштабный коэффициент не должен влиять на цвет. - person JerryZhou; 27.09.2016
comment
@ KamilPowałowski для меня это иногда срабатывает ... Я не уверен, почему. Хотел бы я знать, почему это не всегда работает. Так что я делаю это по коду - person Jesus Rodriguez; 05.12.2016
comment
Для меня этот метод раскадровки работает с кнопками, но не с изображениями. Мне все еще нужно установить tintColor в коде для imageViews. - person Derek Soike; 04.02.2017
comment
Это должен быть главный ответ. - person Arel; 25.04.2017
comment
Если кто-то все еще ломает голову над вопросом, почему это не работает в IB, попробуйте установить для параметра imageView Opaque значение No. - person Bonan; 01.08.2017
comment
Это не работает, мой imageView находится в tableviewcell xib. :( - person Nikhil Manapure; 18.11.2017
comment
В tablecell он вообще НЕ работает на UIButton и иногда работает в UIImageView - person Federico Picci; 04.04.2019

Swift 4

Измените оттенок UIImage SVG / PDF, который работает для изображения с уникальным цветом:

введите здесь описание изображения  введите описание изображения здесь

import Foundation
    
// MARK: - UIImage extensions

public extension UIImage {

    //
    /// Tint Image
    ///
    /// - Parameter fillColor: UIColor
    /// - Returns: Image with tint color
    func tint(with fillColor: UIColor) -> UIImage? {
        let image = withRenderingMode(.alwaysTemplate)
        UIGraphicsBeginImageContextWithOptions(size, false, scale)
        fillColor.set()
        image.draw(in: CGRect(origin: .zero, size: size))

        guard let imageColored = UIGraphicsGetImageFromCurrentImageContext() else {
            return nil
        }
        
        UIGraphicsEndImageContext()
        return imageColored
    }
}

Измените оттенок UIImageView, который работает для изображения с уникальным цветом:

введите здесь описание изображения  введите описание изображения здесь

let imageView = UIImageView(frame: CGRect(x: 50, y: 50, width: 50, height: 50))
imageView.image = UIImage(named: "hello.png")!.withRenderingMode(.alwaysTemplate)
imageView.tintColor = .yellow

Измените оттенок UIImage на изображение, используйте это:

введите здесь описание изображения  введите описание изображения здесь

import Foundation

// MARK: - Extensions UIImage

public extension UIImage {

    /// Tint, Colorize image with given tint color
    /// This is similar to Photoshop's "Color" layer blend mode
    /// This is perfect for non-greyscale source images, and images that 
    /// have both highlights and shadows that should be preserved<br><br>
    /// white will stay white and black will stay black as the lightness of 
    /// the image is preserved
    ///
    /// - Parameter TintColor: Tint color
    /// - Returns:  Tinted image
    public func tintImage(with fillColor: UIColor) -> UIImage {
        
        return modifiedImage { context, rect in
            // draw black background - workaround to preserve color of partially transparent pixels
            context.setBlendMode(.normal)
            UIColor.black.setFill()
            context.fill(rect)
            
            // draw original image
            context.setBlendMode(.normal)
            context.draw(cgImage!, in: rect)
            
            // tint image (loosing alpha) - the luminosity of the original image is preserved
            context.setBlendMode(.color)
            fillColor.setFill()
            context.fill(rect)
            
            // mask by alpha values of original image
            context.setBlendMode(.destinationIn)
            context.draw(context.makeImage()!, in: rect)
        }
    }
    
    /// Modified Image Context, apply modification on image
    ///
    /// - Parameter draw: (CGContext, CGRect) -> ())
    /// - Returns:        UIImage
    fileprivate func modifiedImage(_ draw: (CGContext, CGRect) -> ()) -> UIImage {
        
        // using scale correctly preserves retina images
        UIGraphicsBeginImageContextWithOptions(size, false, scale)
        let context: CGContext! = UIGraphicsGetCurrentContext()
        assert(context != nil)
        
        // correctly rotate image
        context.translateBy(x: 0, y: size.height)
        context.scaleBy(x: 1.0, y: -1.0)
        
        let rect = CGRect(x: 0.0, y: 0.0, width: size.width, height: size.height)
        
        draw(context, rect)
        
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image!
    }
}
person YannSteph    schedule 31.12.2015
comment
эй, я новичок в swift, но вы сказали здесь, что это для изображений SVG, но я не могу найти способ разобрать SVG в UIImage, не могли бы вы мне помочь? или, может быть, я смогу как-то справиться с этим с помощью SVG. Спасибо! - person Dumitru Rogojinaru; 19.04.2017
comment
@DumitruRogojinaru использует функцию SVG с изображением шаблона в активе - person YannSteph; 05.05.2017
comment
Обновление для Swift 4 - person YannSteph; 02.11.2018

Если кому-то интересно решение без UIImageView:

// (Swift 3)
extension UIImage {
    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
    }
}
person Puttin    schedule 17.01.2017
comment
Вау, работает как по волшебству после того, как искал это в течение часа +. Требуется для: Установка значка в NSTextAttachment цвета, отличного от исходного цвета значка. Стандартный ответ на использование UIImageView и изменение его tintColor здесь не работает, потому что NSTextAttachment не принимает UIImageView. - person marco; 26.01.2017
comment
Это лучшее решение, которое я нашел до сих пор, особенно для тех, кто ищет код, работающий со Swift 3. Отличное предложение! - person shashwat; 27.02.2017

С Swift

let commentImageView = UIImageView(frame: CGRectMake(100, 100, 100, 100))
commentImageView.image = UIImage(named: "myimage.png")!.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate)
commentImageView.tintColor = UIColor.blackColor()
addSubview(commentImageView)
person Esqarrouth    schedule 23.11.2014
comment
можно просто поставить .AlwaysTemplate. - person Rui Peres; 27.01.2015
comment
да, это сокращает код, но похоже, что это может снизить ясность кода. не уверен насчет ярлыков точек из-за этого - person Esqarrouth; 27.01.2015
comment
Я вижу твою точку зрения, просто альтернативу. - person Rui Peres; 27.01.2015

Для быстрых 3 целей

theImageView.image = theImageView.image!.withRenderingMode(.alwaysTemplate)
theImageView.tintColor = UIColor.red
person DairySeeker    schedule 01.09.2016

Попробуй это

http://robots.oughttbot.com/designing-for-ios-blending-modes

or

- (void)viewDidLoad
{
[super viewDidLoad];

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, 30, 300, 50)];
label.numberOfLines = 0;
label.font = [UIFont systemFontOfSize:13];
label.text = @"These checkmarks use the same gray checkmark image with a tintColor applied to the image view";
[self.view addSubview:label];

[self _createImageViewAtY:100 color:[UIColor purpleColor]];
}

- (void)_createImageViewAtY:(int)y color:(UIColor *)color {
UIImage *image = [[UIImage imageNamed:@"gray checkmark.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
CGRect frame = imageView.frame;
frame.origin.x = 100;
frame.origin.y = y;
imageView.frame = frame;

if (color)
    imageView.tintColor = color;

[self.view addSubview:imageView];
}
person yazh    schedule 06.08.2014

Для тонирования изображения UIButton

let image1 = "ic_shopping_cart_empty"
btn_Basket.setImage(UIImage(named: image1)?.withRenderingMode(.alwaysTemplate), for: .normal)
btn_Basket.setImage(UIImage(named: image1)?.withRenderingMode(.alwaysTemplate), for: .selected)
btn_Basket.imageView?.tintColor = UIColor(UIColor.Red)
person Firas Shrourou    schedule 15.04.2018

Воспользуйтесь расширением в Swift: -

extension UIImageView {
    func changeImageColor( color:UIColor) -> UIImage
    {
        image = image!.withRenderingMode(.alwaysTemplate)
        tintColor = color
        return image!
    }
}

   //Change color of logo 
   logoImage.image =  logoImage.changeImageColor(color: .red)

введите здесь описание изображения

person Shrawan    schedule 14.12.2016

iOS

Решение для этого из Interface Builder, установите параметр templateImage в keyPath и выберите цвет оттенка из IB

extension UIImageView {

// make template image with tint color
var templateImage: Bool {
    set {
        if newValue, let image = self.image {
            let newImage = image.withRenderingMode(.alwaysTemplate)
            self.image = newImage
        }
    } get {
        return false
    }
}

}

person Hakob    schedule 31.03.2017

С iOS 13 и выше вы можете просто использовать

let image = UIImage(named: "Heart")?.withRenderingMode(.alwaysTemplate)
if #available(iOS 13.0, *) {
   imageView.image = image?.withTintColor(UIColor.white)
}
person KingofBliss    schedule 20.09.2019

Ответ расширения на Swift 3 от fuzz

func imageWithColor(color: UIColor) -> UIImage {
    UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
    color.setFill()

    let context = UIGraphicsGetCurrentContext()! as CGContext
    context.translateBy(x: 0, y: self.size.height)
    context.scaleBy(x: 1.0, y: -1.0);
    context.setBlendMode(.normal)

    let rect = CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height) as CGRect
    context.clip(to: rect, mask: self.cgImage!)
    context.fill(rect)

    let newImage = UIGraphicsGetImageFromCurrentImageContext()! as UIImage
    UIGraphicsEndImageContext()

    return newImage
}
person Bryan    schedule 15.06.2017

Swift 5

Перерисовка изображения с фоном и цветом заливки

extension UIImage {
  func withBackground(color: UIColor, fill fillColor: UIColor) -> UIImage {
    UIGraphicsBeginImageContextWithOptions(size, true, scale)
    
    guard let ctx = UIGraphicsGetCurrentContext(), let image = cgImage else { return self }
    defer { UIGraphicsEndImageContext() }
    
    ctx.concatenate(CGAffineTransform(a: 1, b: 0, c: 0, d: -1, tx: 0, ty: size.height))
    
    let rect = CGRect(origin: .zero, size: size)
    
    // draw background
    ctx.setFillColor(color.cgColor)
    ctx.fill(rect)
    
    // draw image with fill color
    ctx.clip(to: rect, mask: image)
    ctx.setFillColor(fillColor.cgColor)
    ctx.fill(rect)
    
    return UIGraphicsGetImageFromCurrentImageContext() ?? self
  }
}
person dimpiax    schedule 30.06.2020

Начиная с iOS 13 существует собственный метод для UIImage

let image = yourImage.withTintColor(.systemRed)
person beryllium    schedule 08.10.2020

Кроме того, для приведенных выше ответов в iOS 13 и более поздних версиях есть чистый способ

let image = UIImage(named: "imageName")?.withTintColor(.white, renderingMode: .alwaysTemplate)
person mustafa    schedule 03.12.2020

Теперь я использую этот метод, основанный на ответе Дункана Бэббиджа:

+ (UIImageView *) tintImageView: (UIImageView *)imageView withColor: (UIColor*) color{
    imageView.image = [imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
    [imageView setTintColor:color];
    return imageView;
}
person Josep Escobar    schedule 06.06.2016

Вы можете использовать это в Swift 3, если у вас есть изображение для замены кнопки очистки

func addTextfieldRightView(){

    let rightViewWidth:CGFloat = 30

    let viewMax = self.searchTxt.frame.height
    let buttonMax = self.searchTxt.frame.height - 16

    let buttonView = UIView(frame: CGRect(
        x: self.searchTxt.frame.width - rightViewWidth,
        y: 0,
        width: viewMax,
        height: viewMax))

    let myButton = UIButton(frame: CGRect(
        x: (viewMax - buttonMax) / 2,
        y: (viewMax - buttonMax) / 2,
        width: buttonMax,
        height: buttonMax))

    myButton.setImage(UIImage(named: "BlueClear")!, for: .normal)

    buttonView.addSubview(myButton)

    let clearPressed = UITapGestureRecognizer(target: self, action: #selector(SearchVC.clearPressed(sender:)))
    buttonView.isUserInteractionEnabled = true
    buttonView.addGestureRecognizer(clearPressed)

    myButton.addTarget(self, action: #selector(SearchVC.clearPressed(sender:)), for: .touchUpInside)

    self.searchTxt.rightView = buttonView
    self.searchTxt.rightViewMode = .whileEditing
}
person Chester Schofield    schedule 30.11.2016

Подкласс, который также можно использовать из кода и Interface Builder:

@implementation TintedImageView

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        [self setup];
    }
    return self;
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self setup];
    }
    return self;
}

-(void)setup {
    self.image = [self.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
}

@end
person Łukasz Gierałtowski    schedule 25.01.2017

Это мое расширение UIImage, и вы можете напрямую использовать функцию changeTintColor для изображения.

extension UIImage {

    func changeTintColor(color: UIColor) -> UIImage {
        var newImage = self.withRenderingMode(.alwaysTemplate)
        UIGraphicsBeginImageContextWithOptions(self.size, false, newImage.scale)
        color.set()
        newImage.draw(in: CGRect(x: 0.0, y: 0.0, width: self.size.width, height: self.size.height))
        newImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return newImage
    }

    func changeColor(color: UIColor) -> UIImage {
        let backgroundSize = self.size
        UIGraphicsBeginImageContext(backgroundSize)
        guard let context = UIGraphicsGetCurrentContext() else {
            return self
        }
        var backgroundRect = CGRect()
        backgroundRect.size = backgroundSize
        backgroundRect.origin.x = 0
        backgroundRect.origin.y = 0

        var red: CGFloat = 0
        var green: CGFloat = 0
        var blue: CGFloat = 0
        var alpha: CGFloat = 0
        color.getRed(&red, green: &green, blue: &blue, alpha: &alpha)
        context.setFillColor(red: red, green: green, blue: blue, alpha: alpha)
        context.translateBy(x: 0, y: backgroundSize.height)
        context.scaleBy(x: 1.0, y: -1.0)
        context.clip(to: CGRect(x: 0.0, y: 0.0, width: self.size.width, height: self.size.height),
                 mask: self.cgImage!)
        context.fill(backgroundRect)

        var imageRect = CGRect()
        imageRect.size = self.size
        imageRect.origin.x = (backgroundSize.width - self.size.width) / 2
        imageRect.origin.y = (backgroundSize.height - self.size.height) / 2

        context.setBlendMode(.multiply)
        context.draw(self.cgImage!, in: imageRect)

        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage!
    }

}

Пример использования, подобного этому

let image = UIImage(named: "sample_image")
imageView.image = image.changeTintColor(color: UIColor.red)

И вы можете использовать функцию изменения changeColor, чтобы изменить цвет изображения

person abdullahselek    schedule 31.03.2017

profileImageView.image = theImageView.image! .withRenderingMode (.alwaysTemplate)
profileImageView.tintColor = UIColor.green

OR

Сначала выберите «Определенное изображение» в активе изображения, а затем выберите «Красный» в качестве «Шаблон» вместо «По умолчанию», а затем введите строку. profileImageView.tintColor = UIColor.green

person Priyanka Jadhav    schedule 10.12.2017

если у вас есть какой-либо идентификатор для изображения SVG, вы можете заполнить цвета в соответствии с идентификатором.

    let image = SVGKImage(named: "iconName")
    let svgIMGV = SVGKFastImageView(frame: self.imgView.frame)
         svgIMGV.image = image
          svgIMGV.fillTintColor(colorImage: UIColor.red, iconID: "Bank")
// Add in extension SVGKImageView
extension SVGKImageView {
 func fillTintColor(colorImage: UIColor, iconID: String) {
        if self.image != nil && self.image.caLayerTree != nil {
            print(self.image.caLayerTree.sublayers)
            guard let sublayers = self.image.caLayerTree.sublayers else { return }
            fillRecursively(sublayers: sublayers, color: colorImage, iconID: iconID)
        }
    }

     private func fillRecursively(sublayers: [CALayer], color: UIColor, iconID: String, hasFoundLayer: Bool) {
        var isLayerFound = false
        for layer in sublayers {
            if let l = layer as? CAShapeLayer {

                print(l.name)                
                //IF you want to color the specific shapelayer by id else remove the l.name  == "myID"  validation
                if let name =  l.name,  hasFoundLayer == true && name == "myID" {
                    self.colorThatImageWIthColor(color: color, layer: l)
                    print("Colouring FInished")
                }
            } else {
                if layer.name == iconID {
                    if let innerSublayer = layer.sublayers as? [CAShapeLayer] {
                        fillRecursively(sublayers: innerSublayer, color: color, iconID: iconID, hasFoundLayer: true )
                        print("FOund")
                    }
                } else {
                    if let l = layer as? CALayer, let sub = l.sublayers {
                        fillRecursively(sublayers: sub, color: color, iconID: iconID, hasFoundLayer: false)
                    }
                }
            }

        }
    }

    func colorThatImageWIthColor(color: UIColor, layer: CAShapeLayer) {
        if layer.strokeColor != nil {
            layer.strokeColor = color.cgColor
        }
        if layer.fillColor != nil {
            layer.fillColor = color.cgColor
        }
    }

}

ИЛИ Проверить этот пример.

https://github.com/ravisfortune/SVGDEMO

person K Ravi Kumar    schedule 15.07.2019

Вот простое расширение, которое работает для Swift 5:

extension UIImageView {

func setImageTintColor(_ color: UIColor) {
    let tintedImage = self.image?.withRenderingMode(.alwaysTemplate)
    self.image = tintedImage
    self.tintColor = color
  }
}

Использование:

myImageView.setImageTintColor(.systemBlue)
person WaliD    schedule 17.03.2021