UIBezierPath下绘制渐变

Posted

技术标签:

【中文标题】UIBezierPath下绘制渐变【英文标题】:Draw gradient under UIBezierPath 【发布时间】:2015-10-23 10:22:14 【问题描述】:

我画了一条曲线。我想从视图一直到直线放置一个渐变(以便渐变曲线与直线一起。)

编辑:这是下面代码产生的照片:

我知道如何画线,也知道如何添加常规渐变,但不能将两者结合在一起。这是我的代码:

override func drawRect(rect: CGRect) 

    // draw the curved line, this code works just fine.
    let path1 = UIBezierPath()
    path1.lineWidth = 1.1
    UIColor.greenColor().setStroke()
    path1.moveToPoint(CGPoint(x: 0, y: bounds.height/2))
    path1.addQuadCurveToPoint(CGPoint(x: bounds.width, y: bounds.height/2), controlPoint: CGPoint(x: bounds.width/2, y: (bounds.height * 0.75)))
    path1.stroke()

    // my attempt to draw the gradient:

    let gradient = CAGradientLayer()
    gradient.startPoint = CGPoint(x: 1, y: 1)
    gradient.endPoint = CGPoint(x: 0, y: 0)
    let colors = [UIColor.whiteColor().CGColor, UIColor(red: 0, green: 1, blue: 1, alpha: 0.4).CGColor]
    gradient.colors = colors

    // the following line is where I need help
    gradient.frame = CGRectMake(0, 475, bounds.width, path1.bounds.height)

    layer.addSublayer(gradient)



我可以设置什么 gradient.frame 等于它的上限是以前绘制的路径?请用 Swift 回答(我已经看到了很多关于这个主题的其他问题,但它们都在目标 C 中)

谢谢

【问题讨论】:

【参考方案1】:

我找到了答案。

下面的代码给了我这个: .

代码如下:

   override func drawRect(rect: CGRect) 

    //draw the line of UIBezierPath 
    let path1 = UIBezierPath()
    path1.lineWidth = 1.1
    UIColor(white: 1, alpha: 1).setStroke()
    path1.moveToPoint(CGPoint(x: 0, y: bounds.height/2))
    path1.addQuadCurveToPoint(CGPoint(x: bounds.width, y: bounds.height/2), controlPoint: CGPoint(x: bounds.width/2, y: (bounds.height * 0.65)))

    path1.stroke()

  // add clipping path. this draws an imaginary line (to create bounds) from the 
   //ends of the UIBezierPath line down to the bottom of the screen
    let clippingPath = path1.copy() as! UIBezierPath
    clippingPath.addLineToPoint(CGPoint(x: self.bounds.width, y: self.bounds.height))
    clippingPath.addLineToPoint(CGPoint(x: 0, y: bounds.height))
    clippingPath.closePath()

    clippingPath.addClip()

    // create and add the gradient
    let colors = [UIColor(red: 0, green: 1, blue: 1, alpha: 0.45).CGColor, UIColor.whiteColor().CGColor]


    let colorSpace = CGColorSpaceCreateDeviceRGB()


    let colorLocations:[CGFloat] = [0.0, 1.0]


    let gradient = CGGradientCreateWithColors(colorSpace,
        colors,
        colorLocations)

    let context = UIGraphicsGetCurrentContext()
    let startPoint = CGPoint(x: 1, y: 1)
    let endPoint = CGPoint(x: 1, y: bounds.maxY)

    // and lastly, draw the gradient.
    CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, CGGradientDrawingOptions.DrawsAfterEndLocation)




【讨论】:

以上是关于UIBezierPath下绘制渐变的主要内容,如果未能解决你的问题,请参考以下文章

iOS 绘制颜色渐变圆环 --- 值得一看

iOS 绘制颜色渐变圆环

带有颜色渐变的 UIBezierPath

在 UIBezierPath 中渲染渐变

矢量图形(高效绘图 13.2)

拖动并缩放使用 UIBezierPath IOS/Swift 绘制的矩形