web-dev-qa-db-ja.com

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]];
    }  
}

私は何を間違えましたか? (画像の色は常に元の色のままです。)

100
Marko Zadravec

このコードの代わりに:

[image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

あなたが持っている必要があります:

image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

これをSwift 4.1で使用します

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

これをアセットに設定することもできます。画像にすべての白いピクセル+透明が含まれていることを確認してください。 enter image description here

70
StackUnderflow

(@ Zhaolong Zhongの投稿を編集できません)

Swift .では、次のことができます。

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

yourImageView.image = image

yourImageView.tintColor = UIColor.blue
32
odemolliens

Swift 2.0+では、次のことができます。

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

yourImageView.image = image

yourImageView.tintColor = UIColor.blueColor()
19
Zhaolong Zhong

目的C

self.imgView.image = [self.imgView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
[self.imgView setTintColor:[UIColor darkGrayColor]];
9
Nischal Hada

さらに一歩。これは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)
    }
}
6
Daniel

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)
3
Gary Davies

@odemolliensの答えはうまくいくはずです。

それでも問題が解決しない場合は、UIImageViewに適用する色合いがInterface Builderで定義されている色と異なることを確認してください。

1
rockdaswift

すべてが正しいという。私の貢献すべての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要素に設定します。

1
ingconti