Die weiße bis transparente Verlaufsebene von iOS ist grau

86

Ich habe einen CAGradientLayer am unteren Rand dieser kleinen Detailansicht eingefügt, die am unteren Rand der App angezeigt wird. Wie Sie sehen können, habe ich die Farben von Weiß auf Klar eingestellt, aber es zeigt sich diese seltsame Grautönung. Irgendwelche Ideen?

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

Hier ist die problematische Ansicht:

Hier ist die problematische Ansicht

Eric Gao
quelle
Was ist unter der Schicht?
Trojaner
Die MapView. Ich kann die Ebene so einstellen, dass clearColor und clearColor verwendet werden, und sie ist vollständig transparent.
Eric Gao
Was ich versuche zu erreichen: Ist die Ebene unter dieser Ebene grau?
Trojanfoe
Nein ... sollte insertSublayer bei Index 0 diese Ebene nicht auf die tiefste Ebene legen? Und wenn ich die Unterebene nicht einfüge, ist der Hintergrund der Ansicht klar, wie er sein sollte. Erst wenn ich den Farbverlauf einstelle, wird diese graue Farbe angezeigt.
Eric Gao
Haben Sie versucht, es stattdessen auf self.detailView.layer.mask zu setzen? (self.detailView.layer.mask = layer;)
Akaino

Antworten:

185

clearColor hat einen schwarzen Farbkanal mit einem Alpha von 0, also musste ich verwenden

[UIColor colorWithWhite:1 alpha:0]

und es funktioniert gut.

Eric Gao
quelle
16
Es ersetzt schwarzen Schatten durch weißen Schatten. Immer noch nicht transparent
RealNmae
2
Wichtig - für 2018, betrachten Sie diesen Ansatz: stackoverflow.com/a/25408833/294884
Fattie
7
@RealNmae Wenn Sie von einer Farbe zu einer klaren wechseln möchten, verwenden Sie UIColor.startColor und UIColor.startColor.withAlphaComponent (0.0) als Ihre beiden Farben.
Conor
@ Conor Dies ist eigentlich die richtige Antwort - danke, funktioniert perfekt, unabhängig von der Farbe
SomaMan
59

In Swift Das hat bei mir funktioniert,

UIColor.white.withAlphaComponent(0).cgColor
Mohammad Zaid Pathan
quelle
3
Vergessen Sie nicht, die .cgColor wie in der Antwort gezeigt hinzuzufügen !!! Ich habe versehentlich UIColor.white.withAlphaComponent (0) verwendet und mich eine Stunde lang am Kopf gekratzt und mich gefragt, warum es immer noch grau ist.
SnoopyProtocol
21

Es ist erwähnenswert, dass jede andere Farbe so funktioniert ... mit einer Kombination der beiden obigen Antworten ....

Ziel c

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

Swift 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)
Magoo
quelle
12

Swift 3 Syntax,

UIColor(white: 1, alpha: 0).cgColor
Stuart Casarotto
quelle
1

Die obigen Antworten wie:

UIColor.white.withAlphaComponent(0).cgColor

und

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

sollte funktionieren, um einen Teil Ihres Verlaufs klar zu machen (und nicht das Grau, auf das sich OP bezieht). Wenn Sie jedoch immer noch ein transparentes Weiß sehen, wenn Sie eine klare Farbe sehen sollten, stellen Sie sicher, dass auch backgroundColordie Ansicht, auf die Sie den Verlauf anwenden, klar ist.

Standardmäßig ist die Hintergrundfarbe dieser Ansicht wahrscheinlich weiß (oder eine dunkle Farbe, wenn sich das Gerät im dunklen Modus befindet). Wenn Sie also den Farbverlauf anwenden, wird der klare Teil davon durch die Ansicht backgroundColorselbst "blockiert" . Setzen Sie das auf klar und Sie sollten bereit sein zu gehen.

Brian Sachetta
quelle
0

Wie viele habe ich trotz der Verwendung eines klaren Weiß immer noch eine graue Farbe.

Also änderte ich meinen Ansatz und entschied mich für eine Maske anstatt für einen Farbverlauf. Das Endergebnis ist das gleiche, na ja, besser, da dieses in allen Situationen funktioniert, nicht nur, wenn Sie einen geeigneten Hintergrund haben.

Ich habe diesen Code nicht mit IB ausprobiert, aber hoffentlich funktioniert er auch. Einfach einstellen backgroundColorund los geht's.

@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()
    }
}
Tancrede Chazallet
quelle
0

Es ist erwähnenswert, dass dieser Ansatz auch mit den neuen Systemfarben funktioniert, um Weiß / Schwarz-Verläufe (oder wirklich jede Farbe mit hellem / dunklem Erscheinungsbild) basierend auf dem Hell / Dunkel-Modus in iOS 13 zu verarbeiten:

gradientLayer.colors = [
    UIColor.systemBackground.cgColor,
    UIColor.systemBackground.withAlphaComponent(0).cgColor] 
Jake
quelle