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