Copy path with CGPathCreateCopyByStrokingPath, clip, then draw gradient.
//swift import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() var gv = [ESGradientView]() var x = 100 for i in 0...5 { var g = ESGradientView() g.frame = CGRect(x:x, y:200, width:100, height:100) g.gradientColors = i < 3 ? g.gradientColors : [UIColor.redColor().CGColor, UIColor.blackColor().CGColor] gv.append(g) self.view.addSubview(g) x += 110 } gv[1].shape = .Circle gv[2].shape = .CircleOutline gv[4].shape = .Circle gv[5].shape = .CircleOutline gv[5].circleOutlineWidth = 1 } } class ESGradientView: UIView { enum Shape { case Default, Circle, CircleOutline } var shape = Shape.Default var circleOutlineWidth:Int = 4 var gradientColors = [UIColor.redColor().CGColor, UIColor.blueColor().CGColor] var gradientLocations:[CGFloat] = [0, 1] var gradientEndOffset:CGFloat = 20 override func drawRect(rect: CGRect) { var context = UIGraphicsGetCurrentContext() if (shape == .Circle) { let path = getCirclePath(1) path.addClip() } else if (shape == .CircleOutline) { let path = getCirclePath(circleOutlineWidth + 2) var pathRef = CGPathCreateCopyByStrokingPath(path.CGPath, nil, CGFloat(circleOutlineWidth), kCGLineCapRound, kCGLineJoinRound, 1) UIBezierPath(CGPath: pathRef).addClip() } var gradient = CGGradientCreateWithColors(CGColorSpaceCreateDeviceRGB(), gradientColors, gradientLocations) let gradientEndPoint = CGPointMake(bounds.width - gradientEndOffset, bounds.height - gradientEndOffset) CGContextDrawLinearGradient(context, gradient!, CGPointZero, gradientEndPoint, UInt32(kCGGradientDrawsAfterEndLocation)) } func getCirclePath(inset:Int) -> UIBezierPath { let center = CGFloat(bounds.width * 0.5) let radius = CGFloat(center * CGFloat(100 - inset) * 0.01) let centerPoint = CGPointMake(center, center) var cp = UIBezierPath(arcCenter:centerPoint, radius:radius, startAngle:0, endAngle:CGFloat(M_PI * 2), clockwise:true) return cp } }
No comments:
Post a Comment