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

标签 ios swift uiview gradient

我想在我的所有 View 中放置一个渐变背景。

我认为无需在所有 View Controller 中创建 View 的 IBOutlet 即可执行此操作的方法是从 UIView 创建一个新类,在 draw() 中,我将制作 CAGradientLayer 的代码放在查看。

因此,在界面生成器中,我只需要选择背景 View 并将其类设置为我的自定义类。到目前为止它有效。

我的问题是我是否可以毫无问题地做到这一点。有人知道可以吗? 因为继承自 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)
    }

最佳答案

您可以使用 @IBDesignable@IBInspectableStoryboard 配置 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: [CGGradientDrawingOptions(rawValue: 0)])
    }
}

您可以阅读更多相关信息 heretutorial

关于ios - 使用 swift 在 UIView draw() 中绘制渐变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47869179/

相关文章:

ios - 将 CMTime 保存在核心数据 + Xcode8 + swift3 中

ios - 显示类似警报的 View 时出现问题

swift - Swift 中的 UIBezierPath 描边(和填充)

iOS Monotouch - 如何在 ViewDidLoad() 之前设置 Frame?

ios - 监控 MKMapView 重绘事件

ios - 更改自动布局常量不会更新其框架

ios - 我想在不重新启动应用程序的情况下更改应用程序的语言

javascript - AppGyver - PhoneGap 删除加载过渡屏幕

ios - IBOutlet for element in containerview inside original viewcontroller

swift - Dispatch Main Queue - 正确的方法?