CGPathContainsPoint相对于绝对坐标iOS

时间:2016-06-22 09:57:42

标签: swift cgaffinetransform cgpath svgkit

我正在使用SVGKit在我的应用中显示不同的SVG内容。所需的功能之一是检测svg路径内的区域内发生的敲击并用一些颜色填充它。

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参数,但是我不确定如何正确设置转换矩阵。

1 个答案:

答案 0 :(得分:0)

SVGKit具有内置的路径点功能(如果你手动执行它,你可能会错过实现它的微妙之处 - 包括关于相对路径和绝对路径的这一点。)

你能否使用内置版本?

(或者,使用源代码并构建自己的源代码 - 但我最喜欢的是它在4个不同文件中的大约200行源,以处理所有递归转换等)