2016-06-22 12 views
0

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를 매개 변수로 플레이해야한다는 것입니다.

답변

0

SVGKit가 내장 된 포인트 인 경로 기능이 있습니다 (- 절대 경로 대 상대에 대한 본 프로그램 포함 당신이 손으로 그것을 할 경우에 당신이 놓칠 수를 구현하는 방법에 대한 미묘한있다).

당신은 내장 된 버전을 사용할 수 있습니까?

(또는 소스 코드를 사용하여 직접 빌드하십시오. 그러나 내 머리 위로는 4 개의 파일 전체에 걸쳐 약 200 줄의 소스가 있습니다. 모든 재귀 변환을 처리하는 등)