【问题标题】:iOS White to Transparent Gradient Layer is GrayiOS白色到透明渐变层是灰色
【发布时间】: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 = 层;)

标签: ios iphone uiview calayer cagradientlayer


【解决方案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 年,请考虑这种方法:stackoverflow.com/a/25408833/294884
            • @RealNmae 如果您想从一种颜色清除使用 UIColor.startColor 和 UIColor.startColor.withAlphaComponent(0.0) 作为您的两种颜色。
            • @Conor 这实际上是正确的答案 - 谢谢,无论颜色如何都可以完美工作
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多