2016-06-22 30 views
0

私は、SVGKitを使用して、アプリケーション内のさまざまなSVGコンテンツを表示しています。必要な機能の1つは、svgパス内の領域内で発生したタップを検出し、色で塗りつぶすことです。絶対座標を基準としたCGPathContainsPoint iOS

CGPathContainsPointは、ここで適切な解決策であると思われるが、問題は、(タップ点は、全画像領域内の絶対である)私のSVGパスは相対座標で設定されていることです。以下は

は、私が使用しているいくつかのコードです:

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) 
      } 
     } 
    } 
} 

充填コードは動作しますが、比較が満たされていないか、複数の領域につながる、間違っているポイント。

私はCGPathContainsPoint funcのaffineTransformパラメータで遊ぶべきだと考えていますが、マトリックスの変換を正しく設定する方法がわかりません。

答えて

0

SVGKitは、内蔵のポイント・イン・パス機能を持っている( - 絶対パス対に対して約この1を含め、あなたが手でそれを行う場合は、見逃すことが、それを実装についての微妙な点があります)。

組み込みバージョンは使用できませんか?

(あるいは、ソースコードを使用してビルドしてください。しかし、私の頭の上には、4つの異なるファイルにわたって約200行のソースがあり、すべての再帰的な変換などを処理します)

関連する問題