2016-06-22 12 views
0

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.

Antwort

0

SVGKit hat die Point-in-Path-Funktion eingebaut (es gibt Feinheiten bei der Implementierung, die Sie verpassen können, wenn Sie es manuell tun - einschließlich dieses über relative vs absolute Pfade).

Können Sie die integrierte Version nicht verwenden?

(alternativ, verwenden Sie den Quellcode und bauen Sie Ihre eigenen - aber aus teh Spitze von meinem Kopf ist es etwa 200 Zeilen Quelle über 4 verschiedene Dateien, alle rekursiven Transformationen zu handhaben usw.)