Використання кольору відтінку на UIImageView


118

У мене є свій підклас 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]];
    }  
}

Що я зробив не так? (Колір зображення завжди залишається таким, як був спочатку.)


чи можете setTintColorви, створюючи iconView ?
Хіманшу Джоші

1
ти маєш на увазі після self.iconView = [UIImageView alloc] ...? Так, я можу, але це не працює.
Марко Задравець

Потім використовуйте CGContext. Можливо, ви можете знайти свою відповідь тут stackoverflow.com/a/19275079/1790571
Himanshu Joshi

Так, я бачу цю публікацію, але я дійсно не розумію, чому мій код не працює. Використання кольору відтінку набагато більш чистий шлях.
Marko Zadravec

Відповіді:


237

Замість цього коду:

[image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

ти повинен мати:

image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

Використовуйте це в Swift 4.1

image = UIImage(named: "name")!.withRenderingMode(.alwaysTemplate)

9
Не дурна помилка, а дуже важлива деталь. Дякуємо, що опублікували це. Ви просто заощадили мені багато часу. (виправлена ​​помилка)
Алекс Заватоне

47
Ви можете вибрати зображення в активах та вибрати в режимі візуалізації за замовчуванням на правій панелі
Микола Шубенков

Відмінно! Але як повернутись до оригінального нетонованого зображення?
Марсман

Якщо ви хочете отримати нетоноване зображення, ви можете: зберігати тонований в іншій змінній: UIImage image2 = [image imageWithR ....], або ви можете завантажити зображення з файлу знову: image = [UIImage imageNamed: @ "more" ];
Марко Задравець

89

Ви також можете просто встановити це на своєму активі. Переконайтесь, що ваше зображення містить усі білі пікселі + прозорі. введіть тут опис зображення


6
Я все це робив, але чомусь tintColor для мене не працює. Будь-яка ідея, що ще я міг би спробувати?
Банан

1
Який формат зображення ви використовуєте? А зображення все біле + альфа?
StackUnderflow

3
Дивно, що на моїй першій роботі лише 2/3 зображень набрали колір відтінку. Після очищення та складання всіх зображень набрав відтінок.
MathewS

Можливо, ви могли б повідомити про це Apple?
StackUnderflow

11
@Banana, це відома проблема зображень, що не використовують колір відтінку. Я доповідав про це Apple в той час, і вони позначили це як дублікат, щоб вони точно знали про це. Вирішення проблеми полягає у тому, щоб не встановлювати ваш UIImageView зображенням на Дошці розкадрувань. Отже, просто виставіть порожній UIImageView, а потім встановіть його у viewDidLoad (або деінде), і тоді ви побачите tintColor на зображенні.
Марк Мойкенс

38

(Неможливо редагувати публікацію @Zhaolong Zhong)

У швидкій версії 3.0 ви можете:

let image = UIImage(named: "your_image_name")!.withRenderingMode(.alwaysTemplate)

yourImageView.image = image

yourImageView.tintColor = UIColor.blue

19

У швидкій версії 2.0+ ви можете:

let image = UIImage(named: "your_image_name")!.imageWithRenderingMode(.AlwaysTemplate)

yourImageView.image = image

yourImageView.tintColor = UIColor.blueColor()

11

Швидка версія: 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]];

Або

Ви також можете просто встановити це на своєму активі.

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


7

На крок далі. Це випускний підклас UIImageView. (Не точне рішення для оригінального питання.) Використовуйте в Interface Builder, встановивши ім'я класу в TintedImageView. Оновлення в режимі реального часу всередині дизайнера по мірі зміни кольору відтінку.

(Швидкий 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)
    }
}

2
не працює, але він змінює конфігурацію func на: self.image = self.image? .withRenderingMode (UIImageRenderingMode.alwaysTemplate) нехай color = super.tintColor super.tintColor = UIColor.clear super.tintColor = color
lolo_house

5

Зробіть imageView

    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)

1

все сказане правильно. мій внесок Якщо ви не можете / не хочете звертатися до кожного UiImageView, АБО для ефективності Вам потрібно надати ONCE (або приклад для комірок табличних переглядів)

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.


1

Відповідь @odemolliens повинна просто працювати.

Але якщо у вас все ще виникають проблеми, переконайтеся, що колір відтінку, який ви застосовуєте до UIImageView, відрізняється від того, який визначений у Builder інтерфейсів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.