iOS Beyazdan Şeffaf Degrade Katmanına Gri


87

Uygulamanın altında açılan bu küçük ayrıntı görünümünün altına bir CAGradientLayer ekliyorum. Gördüğünüz gibi renkleri beyazdan açık hale getirdim, ancak ortaya çıkan garip gri ton var. Herhangi bir fikir?

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

İşte sorunlu görüş:

İşte sorunlu görüş


Katmanın altında ne var?
trojanfoe

MapView. Katmanı clearColor ve clearColor kullanacak şekilde ayarlayabilirim ve tamamen şeffaf olacaktır.
Eric Gao

Anlamaya çalıştığım şey: bu katmanın altındaki katman gri mi?
trojanfoe

Hayır ... bu katmanı en derin katmana 0 dizinine yerleştirmemeli mi? Ve alt katmanı yerleştirmezsem, görünümün arka planı olması gerektiği gibi net. Sadece o gri rengin ortaya çıkacağı gradyanı ayarladığımda.
Eric Gao

Bunun yerine self.detailView.layer.mask olarak ayarlamayı denediniz mi? (self.detailView.layer.mask = layer;)
Akaino

Yanıtlar:


185

clearColor'un alfa değeri 0 olan siyah renk kanalı var, bu yüzden kullanmak zorunda kaldım

[UIColor colorWithWhite:1 alpha:0]

ve iyi çalışıyor.


16
Siyah gölgeyi beyaz gölgeyle değiştirir. Hâlâ şeffaf değil
RealNmae

2
Önemli - 2018 için şu yaklaşımı göz önünde bulundurun: stackoverflow.com/a/25408833/294884
Fattie

8
@RealNmae Bir renkten temizlemeye gitmek istiyorsanız, iki renginiz olarak UIColor.startColor ve UIColor.startColor.withAlphaComponent (0.0) kullanın.
Conor

1
@Conor Bu aslında doğru cevap - teşekkürler, renk ne olursa olsun mükemmel çalışıyor
SomaMan

60

In Swift Bu, benim için çalıştı

UIColor.white.withAlphaComponent(0).cgColor

3
Cevapta gösterildiği gibi .cgColor eklemeyi unutmayın !!! Yanlışlıkla UIColor.white.withAlphaComponent (0) kullandım ve neden hala gri olduğunu merak ederek bir saat boyunca kafamı kaşıyordum.
SnoopyProtocol

21

Yukarıdaki iki cevabın bir kombinasyonunu kullanarak başka herhangi bir rengin böyle çalışacağını belirtmeye değer ....

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

Hızlı 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

Yukarıdaki cevaplar şöyle:

UIColor.white.withAlphaComponent(0).cgColor

ve

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

gradyanınızın bir kısmının net olmasını sağlamak açısından çalışmalıdır (OP'nin bahsettiği gri yerine). Ancak, net bir renk görmeniz gerektiğinde hala şeffaf bir beyaz görüyorsanız backgroundColor, degradeyi uyguladığınız görünümün de net olduğundan emin olun .

Varsayılan olarak, bu görünümün arka plan rengi büyük olasılıkla beyaz olacaktır (veya cihaz karanlık moddaysa koyu renk olacaktır), bu nedenle degradeyi uyguladığınızda, görünümün net kısmı görünümün backgroundColorkendisi tarafından "engellenecektir" . Bunu temizlemek için ayarlayın ve gitmeniz iyi olur.


0

Pek çok kişi gibi, berrak beyaz kullanmama rağmen hala gri bir renge sahibim.

Bu yüzden yaklaşımımı değiştirdim ve eğim yerine maskeye gittim. Nihai sonuç aynıdır, daha iyi, çünkü bu sadece uygun bir geçmişe sahipseniz değil, her durumda işe yarar.

Bu kodu IB ile denemedim ama umarım o da işe yarar. Sadece ayarla backgroundColorve gitmekte fayda var.

@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

Beyaz / siyah (veya gerçekten açık / koyu görünümde herhangi bir renk) degradeleri iOS 13'teki açık / koyu moduna dayalı olarak işlemek için bu yaklaşımın yeni sistem renkleriyle de çalıştığını belirtmek gerekir:

gradientLayer.colors = [
    UIColor.systemBackground.cgColor,
    UIColor.systemBackground.withAlphaComponent(0).cgColor] 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.