SVGKit을 사용하여 내 앱에서 다른 SVG 콘텐츠를 표시하고 있습니다. 필요한 기능 중 하나는 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를 매개 변수로 플레이해야한다는 것입니다.