Использование цвета оттенков в UIImageView
У меня есть свой собственный подкласс 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]];
}
}
Что я сделал не так? (Цвет изображения всегда остается прежним.)
Ответы
Ответ 1
Вместо этого кода:
[image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
у тебя должно быть:
image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
Используйте это в Swift 4.1
image = UIImage(named: "name")!.withRenderingMode(.alwaysTemplate)
Ответ 2
Вы также можете просто установить это на свой актив. Убедитесь, что ваше изображение содержит все белые пиксели + прозрачные.
![введите описание изображения здесь]()
Ответ 3
(Невозможно отредактировать пост @Zhaolong Zhong)
В быстрой 3.0 вы можете сделать:
let image = UIImage(named: "your_image_name")!.withRenderingMode(.alwaysTemplate)
yourImageView.image = image
yourImageView.tintColor = UIColor.blue
Ответ 4
В swift 2.0+ вы можете:
let image = UIImage(named: "your_image_name")!.imageWithRenderingMode(.AlwaysTemplate)
yourImageView.image = image
yourImageView.tintColor = UIColor.blueColor()
Ответ 5
Цель C
self.imgView.image = [self.imgView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
[self.imgView setTintColor:[UIColor darkGrayColor]];
Ответ 6
Еще один шаг. Это подкаталог UIImageView. (Неточное решение для исходного вопроса.) Используйте в Interface Builder, установив имя класса в TintedImageView. Обновления в режиме реального времени внутри дизайнера по мере изменения цвета оттенков.
(Swift 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)
}
}
Ответ 7
Сделайте изображениеView
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)
Ответ 8
все сказано правильно. мой вклад Если вы не можете/не хотите применять к каждому UiImageView, ИЛИ для эффективности, вам нужно сделать ОДИН РАЗ (или пример для ячеек таблиц)
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.
Ответ 9
Ответ @odemolliens должен просто работать.
Но если у вас все еще есть проблемы, убедитесь, что цвет оттенка, который вы применяете к UIImageView, отличается от цвета, определенного в Интерфейсном Разработчике.
Ответ 10
Я только что узнал, что мой оттенок не менялся в ViewDidLoad (или даже устанавливал его в Интерфейсном Разработчике). Звонок в поле зрения WillAppear решил мою проблему!
override func viewWillAppear(_ animated: Bool)
{
super.viewWillAppear(animated)
myImageView.tintColor = UIColor.white
}