如何将Gradient应用于iOS Swift App的后台视图

 莹TX_937 发布于 2023-01-07 20:19

我正在尝试应用渐变作为视图的背景颜色(故事板的主视图).代码运行,但没有任何变化.我正在使用xCode Beta 2和Swift.

这是代码:

class Colors {
  let colorTop = UIColor(red: 192.0/255.0, green: 38.0/255.0, blue: 42.0/255.0, alpha: 1.0)
  let colorBottom = UIColor(red: 35.0/255.0, green: 2.0/255.0, blue: 2.0/255.0, alpha: 1.0)

  let gl: CAGradientLayer

  init() {
    gl = CAGradientLayer()
    gl.colors = [ colorTop, colorBottom]
    gl.locations = [ 0.0, 1.0]
  }
}

然后在视图控制器中:

  let colors = Colors()

  func refresh() {
        view.backgroundColor = UIColor.clearColor()
        var backgroundLayer = colors.gl
        backgroundLayer.frame = view.frame
        view.layer.insertSublayer(backgroundLayer, atIndex: 0)
      }
    }
  }

Leo Dabus.. 153

Xcode 8.2•Swift 3.0.2


您可以设计自己的渐变视图,如下所示:

@IBDesignable
class GradientView: UIView {

    @IBInspectable var startColor:   UIColor = .black { didSet { updateColors() }}
    @IBInspectable var endColor:     UIColor = .white { didSet { updateColors() }}
    @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() }}

    override public class var layerClass: AnyClass { CAGradientLayer.self }

    var gradientLayer: CAGradientLayer { layer as! CAGradientLayer }

    func updatePoints() {
        if horizontalMode {
            gradientLayer.startPoint = diagonalMode ? .init(x: 1, y: 0) : .init(x: 0, y: 0.5)
            gradientLayer.endPoint   = diagonalMode ? .init(x: 0, y: 1) : .init(x: 1, y: 0.5)
        } else {
            gradientLayer.startPoint = diagonalMode ? .init(x: 0, y: 0) : .init(x: 0.5, y: 0)
            gradientLayer.endPoint   = diagonalMode ? .init(x: 1, y: 1) : .init(x: 0.5, y: 1)
        }
    }
    func updateLocations() {
        gradientLayer.locations = [startLocation as NSNumber, endLocation as NSNumber]
    }
    func updateColors() {
        gradientLayer.colors = [startColor.cgColor, endColor.cgColor]
    }
    override public func layoutSubviews() {
        super.layoutSubviews()
        updatePoints()
        updateLocations()
        updateColors()
    }
}

在此输入图像描述

12 个回答
  • Xcode 8.2•Swift 3.0.2


    您可以设计自己的渐变视图,如下所示:

    @IBDesignable
    class GradientView: UIView {
    
        @IBInspectable var startColor:   UIColor = .black { didSet { updateColors() }}
        @IBInspectable var endColor:     UIColor = .white { didSet { updateColors() }}
        @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() }}
    
        override public class var layerClass: AnyClass { CAGradientLayer.self }
    
        var gradientLayer: CAGradientLayer { layer as! CAGradientLayer }
    
        func updatePoints() {
            if horizontalMode {
                gradientLayer.startPoint = diagonalMode ? .init(x: 1, y: 0) : .init(x: 0, y: 0.5)
                gradientLayer.endPoint   = diagonalMode ? .init(x: 0, y: 1) : .init(x: 1, y: 0.5)
            } else {
                gradientLayer.startPoint = diagonalMode ? .init(x: 0, y: 0) : .init(x: 0.5, y: 0)
                gradientLayer.endPoint   = diagonalMode ? .init(x: 1, y: 1) : .init(x: 0.5, y: 1)
            }
        }
        func updateLocations() {
            gradientLayer.locations = [startLocation as NSNumber, endLocation as NSNumber]
        }
        func updateColors() {
            gradientLayer.colors = [startColor.cgColor, endColor.cgColor]
        }
        override public func layoutSubviews() {
            super.layoutSubviews()
            updatePoints()
            updateLocations()
            updateColors()
        }
    }
    

    在此输入图像描述

    2023-01-07 20:19 回答
  • 只是修改上面提到的答案.

    在此输入图像描述

    func setGradientBackground() {
        let colorTop =  UIColor(red: 255.0/255.0, green: 149.0/255.0, blue: 0.0/255.0, alpha: 1.0).CGColor
        let colorBottom = UIColor(red: 255.0/255.0, green: 94.0/255.0, blue: 58.0/255.0, alpha: 1.0).CGColor
    
        let gradientLayer = CAGradientLayer()
        gradientLayer.colors = [colorTop, colorBottom]
        gradientLayer.locations = [0.0, 1.0]
        gradientLayer.frame = self.view.bounds
    
        self.view.layer.insertSublayer(gradientLayer, at:0)
    }
    

    在此输入图像描述

    2023-01-07 20:20 回答
  • 我制作了一个UIView扩展,将基本渐变应用于任何视图

    extension UIView {
        func layerGradient() {
            let layer : CAGradientLayer = CAGradientLayer()
            layer.frame.size = self.frame.size
            layer.frame.origin = CGPointMake(0.0,0.0)
            layer.cornerRadius = CGFloat(frame.width / 20)
    
            let color0 = UIColor(red:250.0/255, green:250.0/255, blue:250.0/255, alpha:0.5).CGColor
            let color1 = UIColor(red:200.0/255, green:200.0/255, blue: 200.0/255, alpha:0.1).CGColor
            let color2 = UIColor(red:150.0/255, green:150.0/255, blue: 150.0/255, alpha:0.1).CGColor
            let color3 = UIColor(red:100.0/255, green:100.0/255, blue: 100.0/255, alpha:0.1).CGColor
            let color4 = UIColor(red:50.0/255, green:50.0/255, blue:50.0/255, alpha:0.1).CGColor
            let color5 = UIColor(red:0.0/255, green:0.0/255, blue:0.0/255, alpha:0.1).CGColor
            let color6 = UIColor(red:150.0/255, green:150.0/255, blue:150.0/255, alpha:0.1).CGColor
    
            layer.colors = [color0,color1,color2,color3,color4,color5,color6]
            self.layer.insertSublayer(layer, atIndex: 0)
        }
    }       
    

    2023-01-07 20:20 回答
  • 您为渐变提供的颜色必须是类型CGColor.所以设置你的数组CGColorgl.colors.

    正确的代码是:

    class Colors {
        var gl:CAGradientLayer!
    
        init() {
            let colorTop = UIColor(red: 192.0 / 255.0, green: 38.0 / 255.0, blue: 42.0 / 255.0, alpha: 1.0).cgColor
            let colorBottom = UIColor(red: 35.0 / 255.0, green: 2.0 / 255.0, blue: 2.0 / 255.0, alpha: 1.0).cgColor
    
            self.gl = CAGradientLayer()
            self.gl.colors = [colorTop, colorBottom]
            self.gl.locations = [0.0, 1.0]
        }
    }
    

    2023-01-07 20:21 回答
  • 如果您需要更改渐变的方向,则必须使用startPoint和endPoint.

    let gradient: CAGradientLayer = CAGradientLayer()
    
    gradient.colors = [UIColor.blue.cgColor, UIColor.red.cgColor]
    gradient.locations = [0.0 , 1.0]
    gradient.startPoint = CGPoint(x: 0.0, y: 1.0)
    gradient.endPoint = CGPoint(x: 1.0, y: 1.0)
    gradient.frame = CGRect(x: 0.0, y: 0.0, width: self.view.frame.size.width, height: self.view.frame.size.height)
    
    self.view.layer.insertSublayer(gradient, atIndex: 0)
    

    2023-01-07 20:21 回答
  • UIView使用此自定义类进行扩展.


    GradientView.swift

    import UIKit
    
    class GradientView: UIView {
    
        // Default Colors
        var colors:[UIColor] = [UIColor.redColor(), UIColor.blueColor()]
    
        override func drawRect(rect: CGRect) {
    
            // Must be set when the rect is drawn
            setGradient(colors[0], color2: colors[1])
        }
    
        func setGradient(color1: UIColor, color2: UIColor) {
    
            let context = UIGraphicsGetCurrentContext()
            let gradient = CGGradientCreateWithColors(CGColorSpaceCreateDeviceRGB(), [color1.CGColor, color2.CGColor], [0, 1])!
    
            // Draw Path
            let path = UIBezierPath(rect: CGRectMake(0, 0, frame.width, frame.height))
            CGContextSaveGState(context)
            path.addClip()
            CGContextDrawLinearGradient(context, gradient, CGPointMake(frame.width / 2, 0), CGPointMake(frame.width / 2, frame.height), CGGradientDrawingOptions())
            CGContextRestoreGState(context)
        }
    
        override func layoutSubviews() {
    
            // Ensure view has a transparent background color (not required)
            backgroundColor = UIColor.clearColor()
        }
    
    }
    

    用法

    gradientView.colors = [UIColor.blackColor().colorWithAlphaComponent(0.8), UIColor.clearColor()]


    结果

    在此输入图像描述

    2023-01-07 20:21 回答
  • 这简单

        // MARK: - Gradient
    extension CAGradientLayer {
        enum Point {
            case topLeft
            case centerLeft
            case bottomLeft
            case topCenter
            case center
            case bottomCenter
            case topRight
            case centerRight
            case bottomRight
            var point: CGPoint {
                switch self {
                case .topLeft:
                    return CGPoint(x: 0, y: 0)
                case .centerLeft:
                    return CGPoint(x: 0, y: 0.5)
                case .bottomLeft:
                    return CGPoint(x: 0, y: 1.0)
                case .topCenter:
                    return CGPoint(x: 0.5, y: 0)
                case .center:
                    return CGPoint(x: 0.5, y: 0.5)
                case .bottomCenter:
                    return CGPoint(x: 0.5, y: 1.0)
                case .topRight:
                    return CGPoint(x: 1.0, y: 0.0)
                case .centerRight:
                    return CGPoint(x: 1.0, y: 0.5)
                case .bottomRight:
                    return CGPoint(x: 1.0, y: 1.0)
                }
            }
        }
        convenience init(start: Point, end: Point, colors: [CGColor], type: CAGradientLayerType) {
            self.init()
            self.startPoint = start.point
            self.endPoint = end.point
            self.colors = colors
            self.locations = (0..<colors.count).map(NSNumber.init)
            self.type = type
        }
    }
    

    像这样使用:

    let fistColor = UIColor.white
    let lastColor = UIColor.black
    let gradient = CAGradientLayer(start: .topLeft, end: .topRight, colors: [fistColor.cgColor, lastColor.cgColor], type: .radial)
    gradient.frame = yourView.bounds
    yourView.layer.addSublayer(gradient)
    

    2023-01-07 20:21 回答
  • 我有这些扩展:

    @IBDesignable class GradientView: UIView {
        @IBInspectable var firstColor: UIColor = UIColor.red
        @IBInspectable var secondColor: UIColor = UIColor.green
    
        @IBInspectable var vertical: Bool = true
    
        lazy var gradientLayer: CAGradientLayer = {
            let layer = CAGradientLayer()
            layer.colors = [firstColor.cgColor, secondColor.cgColor]
            layer.startPoint = CGPoint.zero
            return layer
        }()
    
        //MARK: -
    
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
    
            applyGradient()
        }
    
        override init(frame: CGRect) {
            super.init(frame: frame)
    
            applyGradient()
        }
    
        override func prepareForInterfaceBuilder() {
            super.prepareForInterfaceBuilder()
            applyGradient()
        }
    
        override func layoutSubviews() {
            super.layoutSubviews()
            updateGradientFrame()
        }
    
        //MARK: -
    
        func applyGradient() {
            updateGradientDirection()
            layer.sublayers = [gradientLayer]
        }
    
        func updateGradientFrame() {
            gradientLayer.frame = bounds
        }
    
        func updateGradientDirection() {
            gradientLayer.endPoint = vertical ? CGPoint(x: 0, y: 1) : CGPoint(x: 1, y: 0)
        }
    }
    
    @IBDesignable class ThreeColorsGradientView: UIView {
        @IBInspectable var firstColor: UIColor = UIColor.red
        @IBInspectable var secondColor: UIColor = UIColor.green
        @IBInspectable var thirdColor: UIColor = UIColor.blue
    
        @IBInspectable var vertical: Bool = true {
            didSet {
                updateGradientDirection()
            }
        }
    
        lazy var gradientLayer: CAGradientLayer = {
            let layer = CAGradientLayer()
            layer.colors = [firstColor.cgColor, secondColor.cgColor, thirdColor.cgColor]
            layer.startPoint = CGPoint.zero
            return layer
        }()
    
        //MARK: -
    
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
    
            applyGradient()
        }
    
        override init(frame: CGRect) {
            super.init(frame: frame)
    
            applyGradient()
        }
    
        override func prepareForInterfaceBuilder() {
            super.prepareForInterfaceBuilder()
            applyGradient()
        }
    
        override func layoutSubviews() {
            super.layoutSubviews()
            updateGradientFrame()
        }
    
        //MARK: -
    
        func applyGradient() {
            updateGradientDirection()
            layer.sublayers = [gradientLayer]
        }
    
        func updateGradientFrame() {
            gradientLayer.frame = bounds
        }
    
        func updateGradientDirection() {
            gradientLayer.endPoint = vertical ? CGPoint(x: 0, y: 1) : CGPoint(x: 1, y: 0)
        }
    }
    
    @IBDesignable class RadialGradientView: UIView {
    
        @IBInspectable var outsideColor: UIColor = UIColor.red
        @IBInspectable var insideColor: UIColor = UIColor.green
    
        override func awakeFromNib() {
            super.awakeFromNib()
    
            applyGradient()
        }
    
        func applyGradient() {
            let colors = [insideColor.cgColor, outsideColor.cgColor] as CFArray
            let endRadius = sqrt(pow(frame.width/2, 2) + pow(frame.height/2, 2))
            let center = CGPoint(x: bounds.size.width / 2, y: bounds.size.height / 2)
            let gradient = CGGradient(colorsSpace: nil, colors: colors, locations: nil)
            let context = UIGraphicsGetCurrentContext()
    
            context?.drawRadialGradient(gradient!, startCenter: center, startRadius: 0.0, endCenter: center, endRadius: endRadius, options: CGGradientDrawingOptions.drawsBeforeStartLocation)
        }
    
        override func draw(_ rect: CGRect) {
            super.draw(rect)
    
            #if TARGET_INTERFACE_BUILDER
                applyGradient()
            #endif
        }
    }
    

    用法:

    在此输入图像描述

    在此输入图像描述

    在此输入图像描述

    2023-01-07 20:21 回答
  • 试试这个,它对我有用,

      var gradientView = UIView(frame: CGRect(x: 0, y: 0, width: 320, height: 35))
      let gradientLayer:CAGradientLayer = CAGradientLayer()
      gradientLayer.frame.size = self.gradientView.frame.size
      gradientLayer.colors = 
      [UIColor.white.cgColor,UIColor.red.withAlphaComponent(1).cgColor] 
      //Use diffrent colors
      gradientView.layer.addSublayer(gradientLayer)
    

    在此输入图像描述

    您可以添加渐变颜色的起点和终点.

        gradientLayer.startPoint = CGPoint(x: 0.0, y: 1.0)
        gradientLayer.endPoint = CGPoint(x: 1.0, y: 1.0)
    

    在此输入图像描述

    有关更多详细说明,请参阅最佳答案,或者您可以关注Apple的CAGradientLayer

    希望这对某些人有帮助.

    2023-01-07 20:21 回答
  • 斯威夫特4

    添加视图插座

    @IBOutlet weak var gradientView: UIView!

    向视图添加渐变

    func setGradient() {
        let gradient: CAGradientLayer = CAGradientLayer()
        gradient.colors = [UIColor.red.cgColor, UIColor.blue.cgColor]
        gradient.locations = [0.0 , 1.0]
        gradient.startPoint = CGPoint(x: 0.0, y: 1.0)
        gradient.endPoint = CGPoint(x: 1.0, y: 1.0)
        gradient.frame = gradientView.layer.frame
        gradientView.layer.insertSublayer(gradient, at: 0)
    }
    

    2023-01-07 20:21 回答
  • Swift3中试试这个:

     func addGradient(){
    
        let gradient:CAGradientLayer = CAGradientLayer()
        gradient.frame.size = self.viewThatHoldsGradient.frame.size
        gradient.colors = [UIColor.white.cgColor,UIColor.white.withAlphaComponent(0).cgColor] //Or any colors
        self.viewThatHoldsGradient.layer.addSublayer(gradient)
    
    }
    

    2023-01-07 20:21 回答
  • 此代码适用于Swift 3.0

    class GradientView: UIView {
    
        override open class var layerClass: AnyClass {
            get{
                return CAGradientLayer.classForCoder()
            }
        }
    
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
            let gradientLayer = self.layer as! CAGradientLayer
            let color1 = UIColor.white.withAlphaComponent(0.1).cgColor as CGColor
            let color2 = UIColor.white.withAlphaComponent(0.9).cgColor as CGColor
            gradientLayer.locations = [0.60, 1.0]
            gradientLayer.colors = [color2, color1]
        }
    }
    

    2023-01-07 20:24 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有