UIImageView에서 색조 색상 사용


118

나만의 하위 클래스가 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]];
    }  
}

내가 뭘 잘못 했어? (이미지의 색상은 항상 원래와 동일하게 유지됩니다.)


iconView를setTintColor 만들 때 할 수 있습니까?
Himanshu Joshi

1
self.iconView = [UIImageView alloc] ... 이후를 의미합니까? 예, 할 수 있지만 작동하지 않습니다.
Marko Zadravec

그런 다음 CGContext를 사용하십시오. 당신이 여기에서 답을 찾을 수있을 수 있습니다 stackoverflow.com/a/19275079/1790571
식품 himanshu 혜택

예,이 게시물을 보았지만 내 코드가 작동하지 않는 이유를 정말로 이해하지 못합니다. 색조 색상을 사용하는 것이 훨씬 더 깨끗한 경로입니다.
Marko Zadravec

답변:


237

이 코드 대신 :

[image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

다음이 있어야합니다.

image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

Swift 4.1 에서 사용

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

9
어리석은 실수는 아니지만 매우 중요한 세부 사항입니다. 게시 해 주셔서 감사합니다. 당신은 저에게 많은 시간을 절약했습니다. (오타 수정)
Alex Zavatone 2015-08-20

47
당신은 자산에 대한 이미지를 선택하고 오른쪽 패널의 기본 렌더링 모드에서 선택할 수 있습니다
니콜라이 Shubenkov에게

우수한! 그러나 어떻게 원래의 착색되지 않은 이미지로 되돌릴 수 있습니까?
Marsman

착색되지 않은 이미지를 얻으려면 다음과 같이 할 수 있습니다. 착색 된 이미지를 다른 변수에 저장합니다. UIImage image2 = [image imageWithR ....], 또는 파일에서 이미지를 다시로드 할 수 있습니다. image = [UIImage imageNamed : @ "more" ];
Marko Zadravec

89

자산에 이것을 설정할 수도 있습니다. 이미지에 모든 흰색 픽셀 + 투명이 포함되어 있는지 확인하십시오. 여기에 이미지 설명 입력


6
이 모든 작업을 수행했지만 어떤 이유로 tintColor가 작동하지 않습니다. 내가 또 무엇을 시도 할 수 있는지 아십니까?
Banana

1
어떤 종류의 이미지 형식을 사용하고 있습니까? 그리고 이미지가 모두 흰색 + 알파입니까?
StackUnderflow

3
이상하게도 처음 몇 번의 실행에서 2/3 이미지 만 색조 색상을 선택했습니다. 모든 이미지를 정리하고 빌드 한 후 색조를 선택했습니다.
MathewS

Apple에 신고 할 수 있습니까?
StackUnderflow

11
@Banana, 이것은 색조 색상을 사용하지 않는 이미지의 알려진 문제입니다. 나는 얼마 전에 그것을 Apple 에보 고했고 그들은 그것을 복제로 표시하여 분명히 알고 있습니다. 해결 방법은 UIImageView를 스토리 보드의 이미지로 설정하지 않는 것입니다. 따라서 빈 UIImageView를 가지고 viewDidLoad (또는 다른 곳)에 설정하면 이미지에 tintColor가 표시됩니다.
Mark Moeykens 2017 년

38

(@Zhaolong Zhong 게시물을 편집 할 수 없음)

swift 3.0 에서는 다음을 수행 할 수 있습니다.

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

yourImageView.image = image

yourImageView.tintColor = UIColor.blue

19

Swift 2.0 이상에서는 다음을 수행 할 수 있습니다.

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

yourImageView.image = image

yourImageView.tintColor = UIColor.blueColor()

11

Swift 버전 : 5.2

let tintableImage = UIImage(named: "myImage")?.withRenderingMode(.alwaysTemplate)
imageView.image = tintableImage
imageView.tintColor = UIColor.red

목표 C

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

또는

자산에 이것을 설정할 수도 있습니다.

여기에 이미지 설명 입력


7

한 단계 더. 이것은 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)
    }
}

2
작동하지 않지만 func configure를 다음과 같이 수정합니다. self.image = self.image? .withRenderingMode (UIImageRenderingMode.alwaysTemplate) let color = super.tintColor super.tintColor = UIColor.clear super.tintColor = color
lolo_house

5

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)

1

모든 말이 맞습니다. 내 기여 모든 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를 모든 UI 요소로 설정합니다.


1

@odemolliens 대답은 작동합니다.

그러나 여전히 문제가있는 경우 UIImageView에 적용하는 색조 색상이 Interface Builder에 정의 된 색상과 다른지 확인하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.