Equivalent of or alternative to CGPathApply in Swift?

后端 未结 4 1045
情深已故
情深已故 2020-12-03 03:42

In the pre-release documentation there appears to be no Swift version of CGPathApply. Is there an equivalent or alternative? I\'m trying to get all subpaths of a CGPath so t

4条回答
  •  不知归路
    2020-12-03 04:05

    Here's the highlights from Ole Begemann's great post (thanks @Gouldsc!), adapted for Swift 3, which allows for accessing the individual elements composing a UIBezierPath instance:

    extension UIBezierPath {
    
        var elements: [PathElement] {
            var pathElements = [PathElement]()
            withUnsafeMutablePointer(to: &pathElements) { elementsPointer in
                cgPath.apply(info: elementsPointer) { (userInfo, nextElementPointer) in
                    let nextElement = PathElement(element: nextElementPointer.pointee)
                    let elementsPointer = userInfo!.assumingMemoryBound(to: [PathElement].self)
                    elementsPointer.pointee.append(nextElement)
                }
            }
            return pathElements
        }
    
    }
    
    public enum PathElement {
    
        case moveToPoint(CGPoint)
        case addLineToPoint(CGPoint)
        case addQuadCurveToPoint(CGPoint, CGPoint)
        case addCurveToPoint(CGPoint, CGPoint, CGPoint)
        case closeSubpath
    
        init(element: CGPathElement) {
            switch element.type {
            case .moveToPoint: self = .moveToPoint(element.points[0])
            case .addLineToPoint: self = .addLineToPoint(element.points[0])
            case .addQuadCurveToPoint: self = .addQuadCurveToPoint(element.points[0], element.points[1])
            case .addCurveToPoint: self = .addCurveToPoint(element.points[0], element.points[1], element.points[2])
            case .closeSubpath: self = .closeSubpath
            }
        }
    
    }
    

提交回复
热议问题