Skip to content

Instantly share code, notes, and snippets.

@mbuchetics
Created November 26, 2018 09:25
Show Gist options
  • Save mbuchetics/e56a7ef7a2551af5089aa30ee246a976 to your computer and use it in GitHub Desktop.
Save mbuchetics/e56a7ef7a2551af5089aa30ee246a976 to your computer and use it in GitHub Desktop.

Revisions

  1. mbuchetics created this gist Nov 26, 2018.
    44 changes: 44 additions & 0 deletions UIBezierPath+Smooth.swift
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,44 @@
    import Foundation
    import CoreGraphics
    import UIKit

    extension UIBezierPath {

    convenience init?(quadCurve points: [CGPoint]) {
    guard points.count > 1 else { return nil }

    self.init()

    var p1 = points[0]
    move(to: p1)

    if points.count == 2 {
    addLine(to: points[1])
    }

    for i in 0..<points.count {
    let mid = midPoint(p1: p1, p2: points[i])

    addQuadCurve(to: mid, controlPoint: controlPoint(p1: mid, p2: p1))
    addQuadCurve(to: points[i], controlPoint: controlPoint(p1: mid, p2: points[i]))

    p1 = points[i]
    }
    }

    private func midPoint(p1: CGPoint, p2: CGPoint) -> CGPoint {
    return CGPoint(x: (p1.x + p2.x) / 2, y: (p1.y + p2.y) / 2)
    }

    private func controlPoint(p1: CGPoint, p2: CGPoint) -> CGPoint {
    var controlPoint = midPoint(p1: p1, p2: p2)
    let diffY = abs(p2.y - controlPoint.y)

    if p1.y < p2.y {
    controlPoint.y += diffY
    } else if p1.y > p2.y {
    controlPoint.y -= diffY
    }
    return controlPoint
    }
    }