2014-03-04 75 views
63

我有我自己的UIButton的子類。我在其上添加UIImageView並添加圖像。我想用色調在圖像上繪製它,但它不起作用。在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]]; 
    } 
} 

我做了什麼錯? (圖像的顏色始終保持相同,因爲它是原)

+0

當你創建** iconView **時,你可以使用'setTintColor'嗎? –

+1

你的意思是在self.iconView = [UIImageView alloc] ...之後?是的,我可以,但它不起作用。 –

+0

然後使用CGContext。也許你可以在這裏找到你的答案http://stackoverflow.com/a/19275079/1790571 –

回答

148

,而不是驗證碼:

[image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; 

你應該有:

image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; 
+7

不是一個愚蠢的錯誤,而是一個非常重要的細節。感謝您發佈此信息。你爲我節省了很多時間。 (更正的錯字) –

+25

您可以選擇資產中的圖像並選擇右側面板的默認渲染模式 –

+0

非常好!但是,你如何恢復到原始的無色圖像? – Marsman

19

在迅速2.0+,你可以這樣做:

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

yourImageView.image = image 

yourImageView.tintColor = UIColor.blueColor() 
23

(無法編輯@Zhaolong鍾後)

在迅速3.0,你可以這樣做:

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

yourImageView.image = image 

yourImageView.tintColor = UIColor.blue 
45

你也可以設置這個在您的資產。確保你的圖像包含所有白色像素+透明。 enter image description here

+3

我做了所有這些,但由於某種原因tintColor不適用於我。任何想法我還能嘗試什麼? – Banana

+1

你使用什麼樣的圖像格式?而且圖像全白+阿爾法? – StackUnderflow

+2

奇怪的是,在我的第一對夫婦的跑步中,只有2/3圖像採用了淺色。清理完畢並構建所有拾取色調的圖像。 – MathewS

7

目標C

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

一步。這是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配置到: self.image = self.image .withRenderingMode(UIImageRenderingMode.alwaysTemplate) 設色= super.tintColor super.tintColor = UIColor.clear super.tintColor =顏色 –

+0

@ lolo_house,但爲什麼它的工作:(? –

2

充分利用的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) 
0

都說是正確的。我的貢獻,如果你不能/不想要應用到每一個的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 
    } 

,並設置爲所有UI元素這UIImage的。