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]];
}
}
私は何を間違えましたか? (画像の色は常に元の色のままです。)
このコードの代わりに:
[image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
あなたが持っている必要があります:
image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
これをSwift 4.1で使用します
image = UIImage(named: "name")!.withRenderingMode(.alwaysTemplate)
(@ Zhaolong Zhongの投稿を編集できません)
Swift .では、次のことができます。
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()
目的C
self.imgView.image = [self.imgView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
[self.imgView setTintColor:[UIColor darkGrayColor]];
さらに一歩。これはUIImageViewのドロップインサブクラスです。 (元の質問の正確な解決策ではありません。)クラス名をTintedImageViewに設定して、Interface Builderで使用します。色合いの色の変更など、デザイナーの内側リアルタイムで更新されます。
(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に適用する色合いがInterface Builderで定義されている色と異なることを確認してください。
すべてが正しいという。私の貢献すべてのUiImageViewに適用できない/したくない場合、効率のためにOR 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のすべてのUI要素に設定します。