代码之家  ›  专栏  ›  技术社区  ›  Eric Gao

iOS白色到透明渐变层为灰色

  •  94
  • Eric Gao  · 技术社区  · 10 年前

    我在应用程序底部弹出的这个小细节视图的底部插入了一个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];
    

    以下是有问题的观点:

    Here is the problematic view

    7 回复  |  直到 8 年前
        1
  •  201
  •   Eric Gao    10 年前

    clearColor有一个alpha为0的黑色通道,所以我不得不使用

    [UIColor colorWithWhite:1 alpha:0]
    

    而且效果很好。

        2
  •  64
  •   Hashem Aboonajmi    7 年前

    在里面 敏捷的 这对我有用,

    UIColor.white.withAlphaComponent(0).cgColor
    
        3
  •  21
  •   budiDino    7 年前

    值得指出的是,任何其他颜色都可以这样。。。使用上面两个答案的组合。。。。

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

    雨燕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)
    
        4
  •  14
  •   Stuart Casarotto    8 年前

    Swift 3语法,

    UIColor(white: 1, alpha: 0).cgColor
    
        5
  •  4
  •   Brian Sachetta    5 年前

    上述答案如下:

    UIColor.white.withAlphaComponent(0).cgColor
    

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

    应该在使渐变的一部分清晰(而不是OP所指的灰色)方面起作用。然而,如果您仍然看到透明的白色,而您应该看到清晰的颜色,请确保 backgroundColor 应用渐变的视图也很清晰。

    默认情况下,该视图的背景色可能是白色(如果设备处于暗模式,则为深色),因此当应用渐变时,其清晰部分将被视图的 背景色 它本身设置为清除,你应该可以离开。

        6
  •  1
  •   Tancrede Chazallet    6 年前

    尽管使用了白色,但我还是得到了灰色。

    所以我改变了我的方法,选择了遮罩而不是渐变。最终的结果是一样的,好的,更好的,因为这一点适用于所有情况,而不仅仅是如果你有合适的背景。

    我没有用IB尝试过这段代码,但希望它也能正常工作。 刚刚设置好 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()
        }
    }
    
        7
  •  0
  •   Jake    5 年前

    值得注意的是,为了在iOS 13中处理基于亮/暗模式的白/黑(或任何具有亮/暗外观的颜色)渐变,这种方法也适用于新的系统颜色:

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