Ich verwende SVGKit, um verschiedene SVG-Inhalte in meiner App anzuzeigen. Eine der erforderlichen Funktionen ist es, das Tippen innerhalb eines Bereichs innerhalb des SVG-Pfads zu erkennen und mit etwas Farbe zu füllen.CGPathContainsPoint relativ zu absoluten Koordinaten iOS
CGPathContainsPoint scheint hier die richtige Lösung zu sein, aber das Problem ist, dass meine Svg-Pfade mit relativen Koordinaten eingerichtet sind (während der Tap-Punkt im gesamten Bildbereich absolut ist).
Unten finden Sie einige Code Ich verwende:
class ViewController: UIViewController {
@IBOutlet weak var imageArea: UIView!
var iv : SVGKLayeredImageView!
let im = SVGKImage(named: "connections.svg")
override func viewDidLoad() {
super.viewDidLoad()
im.size = self.imageArea.frame.size
iv = SVGKLayeredImageView(SVGKImage: im)
let recognizer = UITapGestureRecognizer(target: self, action:#selector(ViewController.handleTap(_:)))
iv.addGestureRecognizer(recognizer)
self.imageArea.addSubview(iv)
}
func handleTap(recognizer: UITapGestureRecognizer) {
let point = recognizer.locationInView(iv)
changeFillColorRecursively(iv.layer.sublayers!, color: UIColor.redColor(), point: point)
}
func changeFillColorRecursively(sublayers: [AnyObject], color: UIColor, point: CGPoint) {
for layer in sublayers {
if let l = layer as? CAShapeLayer {
if CGPathContainsPoint(l.path, nil, point, false) {
l.fillColor = color.CGColor
}
}
if let l = layer as? CALayer, sub = l.sublayers {
changeFillColorRecursively(sub, color: color, point: point)
}
}
}
}
Filling Code funktioniert, aber Punkte Vergleich falsch ist, gefüllt zu keinen oder mehrere Bereiche führt.
Mein Denken ist, dass ich mit affineTransform Parameter von CGPathContainsPoint func spielen sollte, aber ich bin nicht wirklich sicher, wie man Matrix korrekt umstellt.