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