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

मैंने गलत क्या किया? (छवि का रंग हमेशा वही रहता है जो मूल रूप से था।)


क्या आप आइकन व्यूsetTintColor बनाते समय सक्षम हैं ?
हिमांशु जोशी

1
क्या आपका मतलब है self.iconView = [UIImageView आवंटन] ... के बाद? हाँ, मैं कर सकता हूँ, लेकिन यह काम नहीं करता है।
मार्को जादव्रेक

CGContext का उपयोग करें। हो सकता है कि आप अपना जवाब यहां पाएं
हिमांशु जोशी

हां मैं इस पोस्ट को देखता हूं लेकिन मुझे वास्तव में समझ में नहीं आता है कि मेरा कोड क्यों काम नहीं करता है। टिंट रंग का उपयोग करना अधिक स्वच्छ पथ है।
मार्को ज़द्रावेक

जवाबों:


237

इस कोड के बजाय:

[image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

आपको होना चाहिए:

image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

स्विफ्ट 4.1 में इसका इस्तेमाल करें

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

9
एक बेवकूफ गलती नहीं है, लेकिन एक बहुत महत्वपूर्ण विवरण है। इसे पोस्ट करने के लिए धन्यवाद। आपने मुझे बहुत समय बचाया है। (सही टाइपो)
एलेक्स ज़ावाटोन

47
आप संपत्ति में छवि का चयन कर सकते हैं और दाएं पैनल डिफ़ॉल्ट रेंडरिंग मोड में चयन कर सकते हैं
निकोले शुबेनकोव

अति उत्कृष्ट! लेकिन आप मूल अन-टिंटेड छवि पर वापस कैसे लौटते हैं?
मार्समैन

यदि आप अन-टिंटेड छवि प्राप्त करना चाहते हैं: आप विभिन्न वेरिएंट में एक टिंटेड स्टोर कर सकते हैं: UIImage image2 = [image imageWithR ....], या आप फिर से फाइल से इमेज लोड कर सकते हैं: इमेज = [UIImage इमेज का नाम: "" अधिक " ];
मार्को ज़द्रावेक

89

आप इसे केवल अपनी संपत्ति पर भी सेट कर सकते हैं। सुनिश्चित करें कि आपकी छवि में सभी सफेद पिक्सेल + पारदर्शी हैं। यहां छवि विवरण दर्ज करें


6
मैंने यह सब किया, लेकिन किसी कारण से मेरे लिए टिंटकलर काम नहीं करता है। किसी भी विचार मैं और क्या कोशिश कर सकता है?
केले

1
आप किस तरह के छवि प्रारूप का उपयोग कर रहे हैं? और छवि सभी सफेद + अल्फा है?
स्टैकउंडरफ्लो

3
अजीब तरह से केवल 2/3 छवियों के मेरे पहले जोड़े पर टिंट का रंग चढ़ा। सभी चित्रों को साफ करने और बनाने के बाद टिंट को उठाया।
मैथ्यू

शायद आप Apple को रिपोर्ट कर सकते हैं?
स्टैकउंडरफ्लो

11
@ बाना, यह टिंट रंग का उपयोग नहीं करने वाली छवियों का एक ज्ञात मुद्दा है। मैंने कुछ समय पहले इसे Apple को रिपोर्ट किया था और उन्होंने इसे एक डुप्लिकेट के रूप में चिह्नित किया था ताकि वे निश्चित रूप से इसके बारे में जानते हों। समाधान यह है कि स्टोरीबोर्ड पर एक छवि के लिए अपना UIImageView सेट न करें। तो बस एक खाली UIImageView करें और फिर इसे viewDidLoad (या कहीं और) में सेट करें और फिर आपको छवि पर tintColor दिखाई देगा।
मार्क मयकेन्स

38

(@Zhaolong Zhong पोस्ट संपादित नहीं कर सकते)

स्विफ्ट 3.0 में , आप कर सकते हैं:

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

yourImageView.image = image

yourImageView.tintColor = UIColor.blue

19

तेजी से 2.0+ में, आप कर सकते हैं:

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

yourImageView.image = image

yourImageView.tintColor = UIColor.blueColor()

11

स्विफ्ट संस्करण: 5.2

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

उद्देश्य सी

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

या

आप इसे केवल अपनी संपत्ति पर भी सेट कर सकते हैं।

यहां छवि विवरण दर्ज करें


7

एक कदम आगे। यह UIImageView का एक ड्रॉप-इन उपवर्ग है। (मूल प्रश्न के लिए सटीक समाधान नहीं।) वर्ग नाम TintedImageView पर सेट करके इंटरफ़ेस बिल्डर में उपयोग करें। डिज़ाइनर के अंदर वास्तविक समय में अपडेट, रंग रंग बदलता है।

(स्विफ्ट 3.1, एक्सकोड 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
काम नहीं कर रहा है, लेकिन यह फंक कॉन्फिगर को संशोधित करता है: self.image = self.image? .withRenderingMode (UIImageRenderingMode.alwaysTemplate) चलो रंग = 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 पर लागू नहीं कर सकते / कर सकते हैं, या दक्षता के लिए आपको 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 पर सेट करें।


1

@odemolliens जवाब सिर्फ काम करना चाहिए।

लेकिन अगर आप अभी भी समस्या कर रहे हैं, तो सुनिश्चित करें कि आप जिस रंग को UIImageView पर लागू कर रहे हैं, वह इंटरफ़ेस बिल्डर में परिभाषित एक से अलग है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.