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白色到透明渐变层是灰色的主要内容,如果未能解决你的问题,请参考以下文章