首页 文章

使用swift在UIView draw()中绘制渐变

提问于
浏览
5

我想在我的所有视图中添加渐变背景 .

我想这样做而不需要在所有视图控制器中创建视图的IBOutlet的方式是从UIView创建一个新类,并在draw()内部放置在视图中生成CAGradientLayer的代码 .

因此,在界面构建器中,我只需要选择背景视图并将其类设置为我的自定义类 . 它到目前为止工作 .

我的问题是,如果我可以毫无问题地做到这一点 . 有人知道可以吗?因为从UIView继承的模型文件带有注释://如果执行自定义绘图,则仅覆盖draw() .

我不知道创建图层是否重要 . 或者,如果draw()仅适用于低级别绘图或类似的东西 . 对draw()函数的最佳用法一无所知 .

这是代码:

override func draw(_ rect: CGRect) {

        let layer = CAGradientLayer()
        layer.frame = CGRect(x: 0, y: 0, width: self.frame.width, height: self.frame.height)

        let color1 = UIColor(red: 4/255, green: 39/255, blue: 105/255, alpha: 1)
        let color2 = UIColor(red: 1/255, green: 91/255, blue: 168/255, alpha: 1)

        layer.colors = [color1.cgColor, color2.cgColor]
        self.layer.addSublayer(layer)
    }

3 回答

  • 8

    您可以使用 @IBDesignable@IBInspectable 配置 Storyboard 中的startColor和endColor属性 . 如果要使用draw(_ rect :)方法绘制,请使用 CGGradient 指定颜色和位置而不是CAGradientLayer . Simple Gradient类和 draw(_ rect: CGRect) 函数看起来像这样

    import UIKit
    
    @IBDesignable 
    class GradientView: UIView {
    
        @IBInspectable var startColor: UIColor = UIColor(red: 4/255, green: 39/255, blue: 105/255, alpha: 1)
        @IBInspectable var endColor: UIColor = UIColor(red: 1/255, green: 91/255, blue: 168/255, alpha: 1)
    
        override func draw(_ rect: CGRect) {
    
          let context = UIGraphicsGetCurrentContext()!
          let colors = [startColor.cgColor, endColor.cgColor]
    
          let colorSpace = CGColorSpaceCreateDeviceRGB()
    
          let colorLocations: [CGFloat] = [0.0, 1.0]
    
          let gradient = CGGradient(colorsSpace: colorSpace,
                                         colors: colors as CFArray,
                                      locations: colorLocations)!
    
          let startPoint = CGPoint.zero
          let endPoint = CGPoint(x: 0, y: bounds.height)
          context.drawLinearGradient(gradient,
                              start: startPoint,
                                end: endPoint,
                            options: [])
        }
    }
    

    你可以阅读更多关于它heretutorial

  • 0

    您不应该在 draw 函数中添加CAGradientLayer .

    如果你想为一个视图添加一个渐变,那么最简单的方法是使用一个图层(就像你正在做的那样),但不是这样...

    您应该将它作为init方法的一部分添加到视图中,然后在布局子视图方法中更新其框架 .

    像这样......

    class MyView: UIView {
        let gradientLayer: CAGradientLayer = {
            let l = CAGradientLayer()
            let color1 = UIColor(red: 4/255, green: 39/255, blue: 105/255, alpha: 1)
            let color2 = UIColor(red: 1/255, green: 91/255, blue: 168/255, alpha: 1)
            l.colors = [color1.cgColor, color2.cgColor]
            return l
        }()
    
        override init(frame: CGRect) {
            super.init(frame: frame)
    
            layer.addSublayer(gradientLayer)
        }
    
        override func layoutSubviews() {
            super.layoutSubviews()
    
            gradientLayer.frame = bounds
        }
    }
    
  • 0

    我会创建UIView扩展并在需要时应用它 .

    extension UIView {
            func withGradienBackground(color1: UIColor, color2: UIColor, color3: UIColor, color4: UIColor) {
                let layerGradient = CAGradientLayer()
    
                layerGradient.colors = [color1.cgColor, color2.cgColor, color3.cgColor, color4.cgColor]
                layerGradient.frame = bounds
                layerGradient.startPoint = CGPoint(x: 1.5, y: 1.5)
                layerGradient.endPoint = CGPoint(x: 0.0, y: 0.0)
                layerGradient.locations = [0.0, 0.3, 0.4, 1.0]
    
                layer.insertSublayer(layerGradient, at: 0)
            }
    }
    

    在这里,您可以更改func声明以将 startPointendPointlocations 参数指定为变量 .

    之后只需调用此方法即可

    gradienView.withGradienBackground(color1: UIColor.green, color2: UIColor.red, color3: UIColor.blue, color4: UIColor.white)
    

    附:请注意,您可以在 colors 数组中获得所需的颜色

相关问题