我正在使用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参数,但是我不确定如何正确设置转换矩阵。
答案 0 :(得分:0)
SVGKit具有内置的路径点功能(如果你手动执行它,你可能会错过实现它的微妙之处 - 包括关于相对路径和绝对路径的这一点。)
你能否使用内置版本?
(或者,使用源代码并构建自己的源代码 - 但我最喜欢的是它在4个不同文件中的大约200行源,以处理所有递归转换等)