2012-03-29 4 views
4

사람이 MKPolylineView를 터치 할 때 콜 아웃을 표시 할 수있는 방법이 있습니까? UITapGestureRecognizer를 추가하고 선택기에 콜 아웃을 일부 좌표로 표시하려고했습니다. 그러나 didnt는 일한다. 이것에 대한 제안? 심지어지도 오버레이 제스처 인식기를 넣어 생각하지 않을 것 - MKPolylineView의 콜 아웃?

다음

내가 방법

- (MKOverlayView *)mapView:(MKMapView *)mapa viewForOverlay:(id <MKOverlay>)overlay 
     self.polylineView = [[MKPolylineView alloc] initWithPolyline: self.polyline]; 
     self.polylineView.strokeColor = [UIColor blackColor]; 
     self.polylineView.lineWidth = 5.0; 
     self.polylineView.alpha = 0.7; 
     UITapGestureRecognizer *touchOnView = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(addBubble:)]; 
     [touchOnView setNumberOfTapsRequired:1]; 
     [touchOnView setNumberOfTouchesRequired:1]; 
     [self.polylineView addGestureRecognizer:touchOnView]; 

답변

8

매우 흥미로운 질문을 시도하는 것이다. 약간의 실험을 통해 MKPolylineView에서 탭을 감지 할 수 있는지 확인했습니다. 찾은 것처럼 탭 제스쳐는지도 오버레이에서 작동하지 않습니다. 그래서 나는 대신 MKPolylineView이 아니라 MKMapView에 탭 동작을 넣었습니다. 그런 다음 탭을 처리하기 : 당신의 탭이 MKPolylineView의를 벗어난 경우

- (void)handleTapGesture:(UIGestureRecognizer*)gestureRecognizer 
{ 
    if (measureLine != nil) 
    { 
     UIView* hitView = [self.polylineView hitTest:[gestureRecognizer locationInView:self.polylineView] withEvent:nil]; 
    } 
} 

hitView는 전무 할 것이다, 또는 탭 안에 있다면 그것은 self.polylineView 될 것입니다.

이지만, 이는 사용자가 원하는대로 작동하지 않을 수 있습니다. 수평 및 수직선의 경우 기본보기의 크기가 선과 크기가 거의 같기 때문에 완벽하게 작동합니다. 그러나 45도 선의 경우 기본 뷰는 AABB (축 정렬 경계 상자)이기 때문에 선보다 훨씬 커야합니다. 45도 선을 생각하면 수평선과 수직선 만 사용하여 동봉하십시오. 큰 영역으로 끝나기 때문에 탭을 감지하려는 것보다 훨씬 큽니다.

예 :

-------- 
| /| 
| /| 
|/ | 
|/ | 
|/  | 
-------- 

그러나 탭 제스처 또는 적중 테스트를 사용하면 이러한 AABB 내부의 탭을 항상 인식하게됩니다. 따라서 제스처를 부착하려는 위치와 관계없이 - 예 : 시도한대로 MKPolylineView으로 또는 MKMapView으로 가면 거짓 결과가 표시됩니다. 긴 라인의 경우 문제가 악화됩니다.지도보기의 오른쪽 상단에서 왼쪽 하단으로가는 선을 상상해 보면지도보기의 전체 영역을 감싸는 AABB가됩니다. 즉, 왼쪽 위 또는 오른쪽 하단의 탭은 MKPolylineView을 누르는 것으로 해석됩니다.

  • 화면을 변환 :

    • 이 탭을 처리하는 당신의 방법에서지도보기
    • 에 탭 제스처 인식기를 사용

      문제를 해결하기 위해, 나는 다음과 같은 방법을 건의 할 것 지도 좌표로 탭 위치

    • 각 폴리선을 통과하는 루프 (단 1이 아닌 경우)
    • 폴리 라인의 각 점에 대해 윤곽선을 그립니다. 다음 점을 가리키는 cts와이 선에서 멀리 떨어진지도 좌표의 거리를 계산합니다. 이를 계산하려면 삼각법을 사용하십시오.
      • 의 거리가이 분야에 매우 가까운 경우 는 다음의 거리가 그 다음 포인트와 라인에 이동 가까이하지 않은 경우 당신이
      • 을 보여주고 싶었다 무엇이든 콜 아웃 등 세그먼트의 나머지 검사를 중지하고 처리 다음에 연결 세그먼트 만 한 점

이 방법은 당신의 폴리 라인의 길이, 또는 어떤 각도가에 있습니다에 관계없이 작동하도록 보장된다. AABB에 대한 우려는 없습니다. 단점은 모든 거리 계산이 계산 비용이 많이 든다는 것입니다. 따라서 폴리 라인이 많은 수의 포인트로 구성되어 있거나 많은 폴리 ​​라인이있는 경우 이러한 계산을 모두 수행하지 못할 수도 있습니다 UI가 반응하지 못하도록 차단하지 않고,이를 백그라운드 스레드로 옮겨야합니다. 소수의 폴리 라인 만 가지고 있거나 몇 점으로 구성되어 있다면, 괜찮을 것입니다.