Ich habe meine eigene Unterklasse von UIButton
. Ich füge UIImageView
hinzu und füge ein Bild hinzu. Ich möchte das Bild mit einer Tönungsfarbe übermalen, aber es funktioniert nicht.
Bisher habe ich:
- (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];
...
und bei Auswahl:
- (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]];
}
}
Was habe ich falsch gemacht? (Die Farbe des Bildes bleibt immer gleich wie ursprünglich.)
Anstelle dieses Codes:
[image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
du solltest haben:
image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
Verwenden Sie dies in Swift 4.1
image = UIImage(named: "name")!.withRenderingMode(.alwaysTemplate)
(@Zhaolong Zhong-Beitrag kann nicht bearbeitet werden)
In Swift 3.0 können Sie Folgendes tun:
let image = UIImage(named: "your_image_name")!.withRenderingMode(.alwaysTemplate)
yourImageView.image = image
yourImageView.tintColor = UIColor.blue
In Swift 2.0+ können Sie Folgendes tun:
let image = UIImage(named: "your_image_name")!.imageWithRenderingMode(.AlwaysTemplate)
yourImageView.image = image
yourImageView.tintColor = UIColor.blueColor()
Ziel c
self.imgView.image = [self.imgView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
[self.imgView setTintColor:[UIColor darkGrayColor]];
Einen Schritt weiter. Dies ist eine Drop-In-Unterklasse von UIImageView. (Keine exakte Lösung für die ursprüngliche Frage.) Verwenden Sie im Interface Builder, indem Sie den Klassennamen auf TintedImageView setzen. Updates in Echtzeit innerhalb des Designers, wenn sich die Tönungsfarbe ändert.
(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)
}
}
Machen Sie die ImageView
let imageView = UIImageView(frame: frame!)
imageView.contentMode = .ScaleAspectFit
imageView.tintColor = tintColor
Machen Sie das Bild
let mainBundle = NSBundle.mainBundle()
var image = UIImage(named: filename!, inBundle: mainBundle, compatibleWithTraitCollection: nil)
image = image?.imageWithRenderingMode(.AlwaysTemplate)
Verbinden Sie sie miteinander
imageView?.image = image
Zeigen Sie es an
view.addSubview(imageView)
@odemolliens Antwort sollte einfach funktionieren.
Wenn Sie jedoch weiterhin Probleme haben, stellen Sie sicher, dass sich die Tönungsfarbe, die Sie auf UIImageView anwenden, von der im Interface Builder definierten unterscheidet.
alles gesagt ist richtig. Mein Beitrag Wenn Sie sich nicht für jede UiImageView bewerben möchten, ist OR aus Effizienzgründen erforderlich.
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
}
Und alle UI-Elemente dieses UIImage festlegen.