Использование цвета оттенка на 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]];
}
}
что я сделал не так? (цвет изображения остается всегда тем же-как это было оригинально)
9 ответов:
вместо этого кода:
[image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
вы должны:
image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
использовать это в Swift 4.1
image = UIImage(named: "name")!.withRenderingMode(.alwaysTemplate)
(Не могу редактировать @Zhaolong Zhong post)
быстро 3.0, вы можете сделать:
let image = UIImage(named: "your_image_name")!.withRenderingMode(.alwaysTemplate) yourImageView.image = image yourImageView.tintColor = UIColor.blue
в Swift 2.0+, вы можете сделать:
let image = UIImage(named: "your_image_name")!.imageWithRenderingMode(.AlwaysTemplate) yourImageView.image = image yourImageView.tintColor = UIColor.blueColor()
С
self.imgView.image = [self.imgView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; [self.imgView setTintColor:[UIColor darkGrayColor]];
еще один шаг. Это выпадающий подкласс 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) } }
сделать 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)
@odemolliens ответ должен просто работать.
но если у вас все еще есть проблемы, убедитесь, что цвет оттенка, который вы применяете к UIImageView, отличается от того, который определен в Построителе интерфейса.
все сказанное верно. мой вклад, Если вы не можете / не хотите применять к каждому UiImageView, или для эффективности вам нужно сделать один раз (или пример для ячеек tableviews)
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.