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

Posted

技术标签:

【中文标题】iOS白色到透明渐变层是灰色【英文标题】:iOS White to Transparent Gradient Layer is Gray 【发布时间】:2014-09-12 23:27:29 【问题描述】:

我在应用底部弹出的这个小细节视图的底部插入了一个 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处的insertSublayer放在最深层吗?如果我不插入子图层,视图的背景应该是清晰的。只有当我设置渐变时,灰色才会出现。 您是否尝试将其设置为 self.detailView.layer.mask ? (self.detailView.layer.mask = 层;) 【参考方案1】:

以上答案如:

UIColor.white.withAlphaComponent(0).cgColor

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

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

默认情况下,该视图的背景颜色可能是白色(如果设备处于黑暗模式,则为深色),因此当您应用渐变时,它的透明部分将被视图的 @987654324 “阻挡” @ 本身。将其设置为清除,您应该一切顺利。

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

尽管使用了透明的白色,但我仍然得到灰色。

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

我没有在 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()
    

【讨论】:

【参考方案4】:

值得指出的是,任何其他颜色都会像这样工作......使用上面两个答案的组合......

目标 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)

【讨论】:

【参考方案5】:

Swift 这对我有用,

UIColor.white.withAlphaComponent(0).cgColor

【讨论】:

不要忘记添加.cgColor,如答案所示!!!我不小心使用了 UIColor.white.withAlphaComponent(0) 并且挠了一个小时想知道为什么它仍然是灰色的。【参考方案6】:

Swift 3 语法,

UIColor(white: 1, alpha: 0).cgColor

【讨论】:

【参考方案7】:

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

[UIColor colorWithWhite:1 alpha:0]

而且效果很好。

【讨论】:

用白色阴影代替黑色阴影。还是不透明 重要 - 对于 2018 年,请考虑这种方法:***.com/a/25408833/294884 @RealNmae 如果您想从一种颜色清除使用 UIColor.startColor 和 UIColor.startColor.withAlphaComponent(0.0) 作为您的两种颜色。 @Conor 这实际上是正确的答案 - 谢谢,无论颜色如何都可以完美工作

以上是关于iOS白色到透明渐变层是灰色的主要内容,如果未能解决你的问题,请参考以下文章

css在灰色透明的背景下,如何才能使上面的字的颜色为白色?

绘制白色会产生透明色

gis缩放至图层是灰色的

放大弹出透明png为灰色

如何用ps把照片的灰色背景变为纯白色?

如何让状态栏透明,文字颜色为灰色?