iOS व्हाइट टू ट्रांसपेरेंट ग्रेडिएंट लेयर ग्रे है


87

मेरे पास इस छोटे विवरण के निचले भाग में एक CAGradientLayer डाला गया है जो ऐप के निचले भाग में पॉप अप करता है। जैसा कि आप देख सकते हैं, मैंने रंगों को सफेद से साफ करने के लिए सेट किया है, लेकिन यह अजीब ग्रे रंग है जो दिखाई दे रहा है। कोई विचार?

    // Set up detail view frame and gradient
    [self.detailView setFrame:CGRectMake(0, 568, 320, 55)];

    CAGradientLayer *layer = [CAGradientLayer layer];
    layer.frame = self.detailView.bounds;
    layer.colors = [NSArray arrayWithObjects:(id)[UIColor whiteColor].CGColor, (id)[UIColor clearColor].CGColor, nil];
    layer.startPoint = CGPointMake(1.0f, 0.7f);
    layer.endPoint = CGPointMake(1.0f, 0.0f);
    [self.detailView.layer insertSublayer:layer atIndex:0];

यहाँ समस्यात्मक दृश्य है:

यहां समस्यात्मक दृश्य है


परत के नीचे क्या है?
ट्रोजनफू जूल

नक्शा दृश्य। मैं ClearColor और ClearColor का उपयोग करने के लिए परत सेट कर सकता हूं और यह पूरी तरह से पारदर्शी होगा।
एरिक गाओ

मैं क्या पाने की कोशिश कर रहा हूं: क्या इस परत के नीचे की परत ग्रे है?
ट्रोजनफू जूल

नहीं ... नहीं डालना चाहिए अनुक्रमणिका 0 पर इस परत को सबसे गहरी परत पर डालें? और अगर मैं उपलेयर सम्मिलित नहीं करता हूं, तो दृश्य की पृष्ठभूमि स्पष्ट है जैसा कि होना चाहिए। यह केवल तभी होता है जब मैं ढाल सेट करता हूं जो कि ग्रे रंग दिखाता है।
एरिक गाओ

क्या आपने इसे बजाय self.detailView.layer.mask पर सेट करने का प्रयास किया है? (self.detailView.layer.mask = layer;)
अकैनो

जवाबों:


185

ClearColor में 0 के अल्फा के साथ एक ब्लैक कलर चैनल है, इसलिए मुझे इसका उपयोग करना था

[UIColor colorWithWhite:1 alpha:0]

और यह ठीक काम करता है।


16
यह काली छाया को सफेद छाया के साथ बदल देता है। अभी भी पारदर्शी नहीं है
RealNmae

2
महत्वपूर्ण - 2018 के लिए, इस दृष्टिकोण पर विचार करें: stackoverflow.com/a/25408833/294884
Fattie

7
@RealNmae यदि आप अपने दो रंगों के रूप में UIColor.startColor और UIColor.startColor.withAlphaComponent (0.0) का उपयोग करने के लिए एक रंग से जाना चाहते हैं।
कॉनर

@ कोरनर यह वास्तव में सही उत्तर है - धन्यवाद, रंग की परवाह किए बिना पूरी तरह से काम करता है
सोमन मैन

60

में स्विफ्ट यह मेरे लिए काम किया,

UIColor.white.withAlphaComponent(0).cgColor

3
जवाब में दिखाए गए के रूप में .cgColor जोड़ने के लिए मत भूलना !!! मैंने गलती से UIColor.white.withAlphaComponent (0) का उपयोग किया था और एक घंटे के लिए मेरे सिर को खरोंच कर रहा था और सोच रहा था कि यह अभी भी ग्रे क्यों था।
स्नूपीप्रोटोकॉल

21

वर की ओर इशारा करते हुए कहा कि कोई भी अन्य रंग इस तरह से काम करेगा ... ऊपर दिए गए दो उत्तरों के संयोजन का उपयोग करके ...।

उद्देश्य सी

UIColor *colour = [UIColor redColor];
NSArray *colourArray = @[(id)[colour colorWithAlphaComponent:0.0f].CGColor,(id)colour.CGColor]
NSArray *locations = @[@0.2,@0.8];

CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.colors = colourArray;
gradientLayer.locations = locations;
gradientLayer.frame = self.frame;

[self.layer addSublayer:gradientLayer];

स्विफ्ट 3

let colour:UIColor = .red
let colours:[CGColor] = [colour.withAlphaComponent(0.0).cgColor,colour.cgColor]
let locations:[NSNumber] = [0.2,0.8]

let gradientLayer = CAGradientLayer()
gradientLayer.colors = colours
gradientLayer.locations = locations
gradientLayer.frame = frame

layer.addSublayer(gradientLayer)


1

ऊपर दिए गए जवाब जैसे:

UIColor.white.withAlphaComponent(0).cgColor

तथा

UIColor(white: 1.0, alpha: 0.0).cgColor

अपने ग्रेडिएंट के एक हिस्से को स्पष्ट होने के बजाय काम करना चाहिए (ओपी का उल्लेख करते हुए ग्रे के बजाय)। हालांकि, यदि आप अभी भी पारदर्शी सफेद देख रहे हैं, जब आपको एक स्पष्ट रंग दिखाई दे रहा है, तो सुनिश्चित करें कि backgroundColorजिस दृश्य को आप ढाल लागू कर रहे हैं वह भी स्पष्ट है।

डिफ़ॉल्ट रूप से, उस दृश्य की पृष्ठभूमि का रंग संभवतः सफेद होगा (या डिवाइस के अंधेरे मोड में होने पर एक गहरा रंग), इसलिए जब आप ढाल को लागू करते हैं, तो इसका स्पष्ट भाग दृश्य के द्वारा "अवरुद्ध" हो जाएगा backgroundColor। स्पष्ट करने के लिए सेट करें और आपको जाने के लिए अच्छा होना चाहिए।


0

स्पष्ट रूप से सफेद का उपयोग करने के बावजूद, मुझे अभी भी एक ग्रे रंग मिला है।

इसलिए मैंने अपना दृष्टिकोण बदल दिया और एक ढाल के बजाय एक मुखौटा के लिए चला गया। अंतिम परिणाम एक ही है, ठीक है, बेहतर है, क्योंकि यह सभी स्थितियों में काम करता है, न कि अगर आपको एक उपयुक्त पृष्ठभूमि मिली है।

मैंने आईबी के साथ इस कोड की कोशिश नहीं की, लेकिन उम्मीद है कि यह भी काम करेगा। बस सेट है backgroundColorऔर आप जाने के लिए अच्छे हैं।

@IBDesignable
class FadingView: UIView {

    @IBInspectable var startLocation: Double =   0.05 { didSet { updateLocations() }}
    @IBInspectable var endLocation:   Double =   0.95 { didSet { updateLocations() }}
    @IBInspectable var horizontalMode:  Bool =  false { didSet { updatePoints() }}
    @IBInspectable var diagonalMode:    Bool =  false { didSet { updatePoints() }}
    @IBInspectable var invertMode:      Bool =  false { didSet { updateColors() }}

    private let gradientLayerMask = CAGradientLayer()

    private func updatePoints() {
        if horizontalMode {
            gradientLayerMask.startPoint = diagonalMode ? CGPoint(x: 1, y: 0) : CGPoint(x: 0, y: 0.5)
            gradientLayerMask.endPoint   = diagonalMode ? CGPoint(x: 0, y: 1) : CGPoint(x: 1, y: 0.5)
        } else {
            gradientLayerMask.startPoint = diagonalMode ? CGPoint(x: 0, y: 0) : CGPoint(x: 0.5, y: 0)
            gradientLayerMask.endPoint   = diagonalMode ? CGPoint(x: 1, y: 1) : CGPoint(x: 0.5, y: 1)
        }
    }

    private func updateLocations() {
        gradientLayerMask.locations = [startLocation as NSNumber, endLocation as NSNumber]
    }

    private func updateSize() {
        gradientLayerMask.frame = bounds
    }

    private func updateColors() {
        gradientLayerMask.colors = invertMode ? [UIColor.white.cgColor, UIColor.clear.cgColor] : [UIColor.clear.cgColor, UIColor.white.cgColor]
    }

    private func commonInit() {
        layer.mask = gradientLayerMask
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commonInit()
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        updatePoints()
        updateLocations()
        updateSize()
        updateColors()
    }
}

0

यह ध्यान देने योग्य है कि iOS 13 में लाइट / डार्क मोड के आधार पर सफेद / काले (या वास्तव में किसी भी रंग के साथ प्रकाश / अंधेरे दिखावे) ग्रेडिएंट को संभालने के लिए यह दृष्टिकोण नए सिस्टम रंगों के साथ भी काम करता है:

gradientLayer.colors = [
    UIColor.systemBackground.cgColor,
    UIColor.systemBackground.withAlphaComponent(0).cgColor] 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.