बटन में पींग का रंग बदलें - आईओएस


93

मुझे ऐसे आइकन का एक सेट मिला है जो मैंने बनाया है जो पारदर्शी सफेद PNG हैं:

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

और जो मैं करना चाहता हूं, वह उन्हें अन्य रंगों में रंगने में सक्षम है। जैसे नीला, ग्रे इत्यादि।

मैंने देखा है कि 'क्लिक की गई / टैप की गई' वे अपने आप ग्रे में बदल जाती हैं। इसलिए मुझे लगता है कि मुझे वह ग्रे बदल सकता है जो मुझे या तो एक नल या इसकी सामान्य स्थिति के साथ पसंद है:

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

इसे हासिल करने का सबसे अच्छा तरीका क्या होगा?

जवाबों:


225

निम्नलिखित कोड बटन की सामान्य स्थिति के लिए टिंट रंग सेट करेगा:

स्विफ्ट 4 और नए के लिए:

let origImage = UIImage(named: "imageName")
let tintedImage = origImage?.withRenderingMode(.alwaysTemplate)
btn.setImage(tintedImage, for: .normal)
btn.tintColor = .red

जब बटन के लिए स्थिति बदलती है तो आप अपनी आवश्यकता के अनुसार टिंट रंग बदल सकते हैं।


पुराने संस्करण

स्विफ्ट 3 के लिए:

let origImage = UIImage(named: "imageName")
let tintedImage = origImage?.withRenderingMode(.alwaysTemplate)
btn.setImage(tintedImage, forState: .normal)
btn.tintColor = .redColor

स्विफ्ट 2 के लिए: संशोधन इतिहास देखें।


आश्चर्यजनक! लेकिन आप मूल छवि (अन-टिंटेड) पर वापस कैसे लौटते हैं?
मार्समैन

@ मार्समैन अगर आप मेरे समाधान को देखते हैं तो ओरिजिनल इमेजेज इमेज का प्रतिनिधित्व करता है और टिंटेडमैसेज ओरिजिनल इमेज के टिंटेड वर्जन का प्रतिनिधित्व करता है, इसलिए आप ओरिजनल इमेज को रिप्लेस नहीं कर रहे हैं बल्कि इसका नया वर्जन बना रहे हैं और आपके पास एक ही इमेज के दो वर्जन होंगे जिन्हें आप यूज कर सकते हैं आपकी आवश्यकता के अनुसार
युवराजसिंह

iOS 11 में xcode 9.1 के साथ काम नहीं कर रहा है। टिंट रंग जोड़ें, यह पूरी तरह से छवि का रंग बदल जाता है।
विनेश टीपी

विभिन्न संपादनों ने इस उत्तर में गलतियाँ पेश की हैं।
एरिक आया

13

iOS 7 ने विचारों के लिए टिंटकलर नामक एक संपत्ति पेश की (UIImageView सहित)। हालाँकि आपको इसके लिए UIImage पर रेंडरिंग प्रकार सेट करने की आवश्यकता है ताकि कोई प्रभाव न पड़े।

UIImage *originalImage = [UIImage imageNamed:@"image.png"];
UIImage *tintedImage = [originalImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
UIImageView *imageView = [[UIImageView alloc] initWithImage:tintedImage];

imageView.tintColor = [UIColor grayColor];
[self.view addSubview:imageView];

यह आपके द्वारा डिफ़ॉल्ट स्थिति के बाद के प्रभाव को उत्पन्न करना चाहिए।


10

आप इस एक्सटेंशन का उपयोग कर सकते हैं:

import UIKit

extension CGContext {

    func fill(_ rect: CGRect,
              with mask: CGImage,
              using color: CGColor) {

        saveGState()
        defer { restoreGState() }

        translateBy(x: 0.0, y: rect.size.height)
        scaleBy(x: 1.0, y: -1.0)
        setBlendMode(.normal)

        clip(to: rect, mask: mask)

        setFillColor(color)
        fill(rect)
    }
}

extension UIImage {

    func filled(with color: UIColor) -> UIImage {
        let rect = CGRect(origin: .zero, size: self.size)
        guard let mask = self.cgImage else { return self }

        if #available(iOS 10.0, *) {
            let rendererFormat = UIGraphicsImageRendererFormat()
            rendererFormat.scale = self.scale

            let renderer = UIGraphicsImageRenderer(size: rect.size,
                                                   format: rendererFormat)
            return renderer.image { context in
                context.cgContext.fill(rect,
                                       with: mask,
                                       using: color.cgColor)
            }
        } else {
            UIGraphicsBeginImageContextWithOptions(rect.size,
                                                   false,
                                                   self.scale)
            defer { UIGraphicsEndImageContext() }

            guard let context = UIGraphicsGetCurrentContext() else { return self }

            context.fill(rect,
                         with: mask,
                         using: color.cgColor)
            return UIGraphicsGetImageFromCurrentImageContext() ?? self
        }
    }
}

1
यह मेरे लिए भी काम नहीं करता है। जब मैं इस विधि का उपयोग करता हूं, तो मैं देख रहा हूं कि यह रंग है, न कि छवि ने उस रंग को रंगा है।
Moebius

9

छवि के बदलाव के लिए ( उठाओ , शास्त्रीय छवि , फोटो ) का उपयोग करें:

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

स्विफ्ट 2

public extension UIImage {
    /**
     Tint, Colorize image with given tint color<br><br>
     This is similar to Photoshop's "Color" layer blend mode<br><br>
     This is perfect for non-greyscale source images, and images that have both highlights and shadows that should be preserved<br><br>
     white will stay white and black will stay black as the lightness of the image is preserved<br><br>

     <img src="http://yannickstephan.com/easyhelper/tint1.png" height="70" width="120"/>

     **To**

     <img src="http://yannickstephan.com/easyhelper/tint2.png" height="70" width="120"/>

     - parameter tintColor: UIColor

     - returns: UIImage
     */
    public func tintPhoto(tintColor: UIColor) -> UIImage {

        return modifiedImage { context, rect in
            // draw black background - workaround to preserve color of partially transparent pixels
            CGContextSetBlendMode(context, .Normal)
            UIColor.blackColor().setFill()
            CGContextFillRect(context, rect)

            // draw original image
            CGContextSetBlendMode(context, .Normal)
            CGContextDrawImage(context, rect, self.CGImage)

            // tint image (loosing alpha) - the luminosity of the original image is preserved
            CGContextSetBlendMode(context, .Color)
            tintColor.setFill()
            CGContextFillRect(context, rect)

            // mask by alpha values of original image
            CGContextSetBlendMode(context, .DestinationIn)
            CGContextDrawImage(context, rect, self.CGImage)
        }
    }
    /**
     Tint Picto to color

     - parameter fillColor: UIColor

     - returns: UIImage
     */
    public func tintPicto(fillColor: UIColor) -> UIImage {

        return modifiedImage { context, rect in
            // draw tint color
            CGContextSetBlendMode(context, .Normal)
            fillColor.setFill()
            CGContextFillRect(context, rect)

            // mask by alpha values of original image
            CGContextSetBlendMode(context, .DestinationIn)
            CGContextDrawImage(context, rect, self.CGImage)
        }
    }
    /**
     Modified Image Context, apply modification on image

     - parameter draw: (CGContext, CGRect) -> ())

     - returns: UIImage
     */
    private func modifiedImage(@noescape draw: (CGContext, CGRect) -> ()) -> UIImage {

        // using scale correctly preserves retina images
        UIGraphicsBeginImageContextWithOptions(size, false, scale)
        let context: CGContext! = UIGraphicsGetCurrentContext()
        assert(context != nil)

        // correctly rotate image
        CGContextTranslateCTM(context, 0, size.height);
        CGContextScaleCTM(context, 1.0, -1.0);

        let rect = CGRectMake(0.0, 0.0, size.width, size.height)

        draw(context, rect)

        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }
}

युपीडी

स्विफ्ट 3

extension UIImage {

    /**
     Tint, Colorize image with given tint color<br><br>
     This is similar to Photoshop's "Color" layer blend mode<br><br>
     This is perfect for non-greyscale source images, and images that have both highlights and shadows that should be preserved<br><br>
     white will stay white and black will stay black as the lightness of the image is preserved<br><br>

     <img src="http://yannickstephan.com/easyhelper/tint1.png" height="70" width="120"/>

     **To**

     <img src="http://yannickstephan.com/easyhelper/tint2.png" height="70" width="120"/>

     - parameter tintColor: UIColor

     - returns: UIImage
     */
    func tintPhoto(_ tintColor: UIColor) -> UIImage {

        return modifiedImage { context, rect in
            // draw black background - workaround to preserve color of partially transparent pixels
            context.setBlendMode(.normal)
            UIColor.black.setFill()
            context.fill(rect)

            // draw original image
            context.setBlendMode(.normal)
            context.draw(cgImage!, in: rect)

            // tint image (loosing alpha) - the luminosity of the original image is preserved
            context.setBlendMode(.color)
            tintColor.setFill()
            context.fill(rect)

            // mask by alpha values of original image
            context.setBlendMode(.destinationIn)
            context.draw(context.makeImage()!, in: rect)
        }
    }

    /**
     Tint Picto to color

     - parameter fillColor: UIColor

     - returns: UIImage
     */
    func tintPicto(_ fillColor: UIColor) -> UIImage {

        return modifiedImage { context, rect in
            // draw tint color
            context.setBlendMode(.normal)
            fillColor.setFill()
            context.fill(rect)

            // mask by alpha values of original image
            context.setBlendMode(.destinationIn)
            context.draw(cgImage!, in: rect)
        }
    }

    /**
     Modified Image Context, apply modification on image

     - parameter draw: (CGContext, CGRect) -> ())

     - returns: UIImage
     */
    fileprivate func modifiedImage(_ draw: (CGContext, CGRect) -> ()) -> UIImage {

        // using scale correctly preserves retina images
        UIGraphicsBeginImageContextWithOptions(size, false, scale)
        let context: CGContext! = UIGraphicsGetCurrentContext()
        assert(context != nil)

        // correctly rotate image
        context.translateBy(x: 0, y: size.height)
        context.scaleBy(x: 1.0, y: -1.0)

        let rect = CGRect(x: 0.0, y: 0.0, width: size.width, height: size.height)

        draw(context, rect)

        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image!
    }

}

क्या आप मुझे बता सकते हैं कि इस तरीके का उपयोग करने का मतलब है कि उन्हें कैसे कॉल किया जाए?
ashmi123

यह मेरे लिए बिल्कुल भी काम नहीं करता है। मेरे पास बटन की छवि के रूप में एक पीएनजी सेट है। जब मैं या तो tintPhoto या tintPicto का उपयोग करता हूं, तो वे सिर्फ काम नहीं करते हैं।
Moebius

dit आप अपनी छवि के साथ जोड़ें RenderingMode (.alwaysTemplate)? @Moebius
YannSteph

हां, और जब मैं टिंट विधियों में से किसी एक का उपयोग करता हूं तो मुझे जो रंग दिखाई देता है। मैंने भी रंग के अल्फा को 0.5 पर सेट किया है और मैं अभी भी सिर्फ रंग देखता हूं। स्विफ्ट 4
Moebius

ठीक है टिंट @Moebius के बाद अल्फा लागू करें
YannSteph

8

यदि आप एक बटन के लिए छवि सेट कर रहे हैं, तो बस विशेषताओं निरीक्षक पर जाएं और बटन प्रकार को सिस्टम में बदलें। फिर छवि सेट करें और टिंट रंग बदलें। छवि का रंग बदल जाएगा। यदि यह नहीं हुआ, तो बटन प्रकार की जाँच करें।


7

स्विफ्ट 4 या 5

extension UIButton{

    func setImageTintColor(_ color: UIColor) {
        let tintedImage = self.imageView?.image?.withRenderingMode(.alwaysTemplate)
        self.setImage(tintedImage, for: .normal)
        self.tintColor = color
    }

}

उपयोग:

button.setImage(UIImage(named: "image_name"), for: .normal) // You can set image direct from Storyboard
button.setImageTintColor(UIColor.white)

UIbutton देखने के लिए setImageTintColor की कोई विधि नहीं है
वहाब खान

यह UIButton का एक विस्तार है। मैंने ऊपर बनाया है।
क्रुणाल पटेल

6

यदि आप एसेट कैटलॉग का उपयोग करते हैं तो आप टेम्पलेट मोड में रेंडर करने के लिए इमेज एसेट को खुद सेट कर सकते हैं। उसके बाद आप इंटरफ़ेस बिल्डर (या कोड) में बटन के टिंटकलर को सेट कर सकते हैं और इसे लेना चाहिए।


यदि आप एक ही छवि का उपयोग कई स्थानों पर कर रहे हैं तो यह सबसे अच्छा तरीका है क्योंकि आप केवल एसेट कैटलॉग में एक बार टेम्पलेट मोड में छवि सेट करते हैं।
जोनाथन कब्रेरा

यह दृष्टिकोण मेरे काम नहीं आया। जब मैं पीएनजी को एक टेम्पलेट छवि के रूप में सेट करता हूं और फिर टिंट रंग सेट करता हूं, तो छवि को टिंट रंग से बदल दिया जाता है।
Moebius

मेरे लिए भी यह सबसे अच्छा तरीका है। बहुत बहुत धन्यवाद। सरल आसान पुन: प्रयोज्य ...
अल्पारसलान सेल्कुक देवेलिओलु

4

स्विफ्ट 4

    let origImage = UIImage(named: "check")
    let tintedImage = origImage?.withRenderingMode(.alwaysTemplate)
    buttons[0].setImage(tintedImage, for: .normal)
    buttons[0].tintColor = .red

3

यदि आप एसेट कैटलॉग का उपयोग करते हैं तो आप टेम्पलेट मोड में रेंडर करने के लिए इमेज एसेट को खुद सेट कर सकते हैं। उसके बाद आप इंटरफ़ेस बिल्डर (या कोड) में बटन के टिंटकलर को सेट कर सकते हैं और इसे लेना चाहिए।


1

मुझे नीचे सबसे आसान तरीका मिला,

ओपन assetcatalog और छवि का चयन करने के लिए जाना तो गुण निरीक्षक और परिवर्तन Render Asकरने के लिए Template Imageनीचे के रूप में

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

फिर बटन एक्शन विधि में नीचे कोड जोड़ें

yourButton.tintColor = .gray

-1

स्विफ्ट 4 और 4.2

let img = UIImage.init(named: "buttonName")?.withRenderingMode(UIImageRenderingMode.alwaysTemplate)
            btn.setImage(img, for: .normal)
            btn.tintColor = .gray

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

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