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

时间:2017-12-18 13:07:20

标签: ios swift uiview gradient

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

我认为这样做而不需要在所有视图控制器中创建视图的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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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
    }
}

答案 2 :(得分: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)

P.S。 请注意,您可以在colors数组

中添加任意数量的颜色