0

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

4

1 回答 1

0

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

不能用内置版本吗?

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

于 2016-10-13T14:48:03.880 回答