2014-02-22 1 views
2

Mapbox iOS SDK (route-me) 및 iOS MapKit으로 무엇을하고 싶은지 확인하기 위해 빠른 프로토 타입 프로젝트를 진행하고 있습니다.모든 하위 뷰에 이벤트/제스처를 전달할 수 있습니까?

MapBox의 오프라인 기능 (및 클러스터링과 같은 추가 기능)과 함께 두 세계의 장점을 모두 갖추고 있지만 iOS지도 유형을 계속 사용할 수 있는지 확인하고 싶습니다. 지도와 아이오와지도가 함께 작동하지 않는다는 것을 발견 한 후 (또는 SO에 대한 도움을받은 후), 당신은 하나 또는 다른 것을 선택하게됩니다. iOS지도 위에 RMMapView (지도 상자 맵) 디렉토리를 배치하면 어떻게 될지 궁금해지기 시작했습니다. 그런 다음 iOS 맵을보고 싶을 때 RMMapViews 기본 맵을 투명하게 설정하여 바로 아래에있는 iOS 맵이 표시되도록 할 수 있습니다. 원하는 경우 다시 두 배로 iOS지도를 사용할 수 있지만 iOS지도로 전환 할 때 마커를 다시 그릴 필요가 없도록지도 상자 마커를 유지할 수도 있습니다.

enter image description here

는 기본적으로 나는 기본보기 (슈퍼 뷰)를 작성 위에 RMMapView으로,이 파단 (MKMapView 및 RMMapView)을 추가했습니다. 이미 RMMapView의 기본 레이어를 투명하게 만드는 방법을 알아 냈습니다. RMMarkers를 추가 할 수도 있으며, MKMapView 위에 멋지게 배치 할 수 있습니다.

제 문제는 터치 이벤트와 제스처입니다. 이 작업을 수행 할 경우 RMMapView에서 발생하는 모든 접촉과 제스처가 필요하지만 여전히 RMMapView에서 발생하지만 MKMapView에서도 발생합니다. I.E. RMMapView의 기본지도가 투명하지만 해당보기에 마커가있는 경우지도를 스크롤 할 때 MKMapView와 함께 RMMapView를 움직여야합니다 (마커가 움직 이도록). 내가 시도 무엇

:

  1. 무시 그러나 hitTest. 이 접근 방식의 문제점은 일단 터치하면 반환하는보기에서만 터치가 작동한다는 것입니다. RMMapView와 MKMapView 모두에서 터치가 발생해야합니다.
  2. 내 슈퍼 뷰에서 제스처 인식기를 만들었습니다. 그런 다음 두 하위보기 모두에 터치를 전달하려고합니다. 실제로, 이것이 실제로 작동 할지도 모르다. 하지만 제가 말할 수있는 것에서 몇 가지 문제가 있습니다. 처음에는 두 맵보기 모두 맨 위에 스크롤보기가 있으므로 MKMapView에 터치를 전달하면 RMMapView가 작동하지 않습니다. 나는 각지도 스크롤보기에 터치를 전달해야한다고 생각합니다.

그래서 나는 1이 작동하지 않을 것이라고 생각하고, 2를 얻을 수는 없습니다. 누구나 이런 일을하려했습니다. 동일한 터치 이벤트에서 2 가지 다른보기가 작동 할 수 있습니까? 아니면 첫 번째보기에서 이벤트가 이길 수 있습니까?

내 디자인이 잘못되었을 수 있습니다. 누군가 다른 제안이 있으면 버리십시오. RMMapView를 수정하지 말고 정말로 MKMapView를 수정할 수는 없지만 실현 시키십시오.

가장 관련성이 높은 게시물은 다음과 같습니다. How to intercept touches events on a MKMapView or UIWebView objects?. 하지만 MKMapView에서 이벤트를 가로 채고 싶지는 않습니다. 두 개의 sup 뷰에 전달할 수 있도록 SuperView에서 차단하려고합니다.

감사

답변

0

나는 완전히 당신의 필요를 이해하지만, 터치 이벤트가 자동으로 리스폰 더 체인을 따라 전파되는 모르겠습니다. 당신이 그것을 처리하는 경우 당신은 단지 그 방법

– touchesBegan:withEvent: 
– touchesMoved:withEvent: 
– touchesEnded:withEvent: 
– touchesCancelled:withEvent: 

을 무시하고 단지 [슈퍼 touchesBegan ..] 전화 구현에해야합니다.

이는 UIResponder 클래스 참조 문서에 설명되어 있습니다 :이 메소드의 디폴트 구현은 아무것도하지 않습니다

토론. UIResponder의 즉각적인 UIKit 하위 클래스, 특히 UIView는 응답 체인에 메시지를 전달합니다. 메시지를 다음 응답자에게 전달하려면 메시지를 super ( 수퍼 클래스 구현)로 보내십시오. 메시지를 다음 응답자에게 직접 보내지 마십시오. 예 :

[super touchesBegan : touch withEvent : event];

그게 필요한가요?

+0

내 SuperView에서 이러한 메서드를 재정의하고 MKMapView 및 RMMapView에 전달하려고했습니다. 그러나 이들을 무시하고 이벤트를 MKMapView로 전달하는 것은 무한 루프를 유발하는 것으로 보입니다. – lostintranslation

+0

응답 체인 메서드 만 사용하여 이벤트를 전달할 수 있습니다. 그것은 당신을 위해 UIView에 의해 만들어집니다. 이것을 해킹하지 마십시오. 그것은 작동하지 않습니다. –

+0

소리가 잘 들지만 내 질문은 여전히 ​​있습니다. 1. 응답 체인 메서드를 오버라이드 (override)하려고 해, MKMapView에 이벤트를 건네 주면, 무한 루프가 발생합니다. MKMapView와 RMMapView가 모두 이벤트에 응답하기를 바랍니다. I.E. 지도를 스크롤하면 둘 다 스크롤됩니다. – lostintranslation

0

저는 Mapbox iOS SDK (즉, RMMapView 부분)의 관리자입니다.

저는 이것을 시도하지는 않았지만 반대쪽지도에 대한 업데이트를 유도하기 위해 한쪽 또는 다른 쪽에서 region/center/zoom 변경 위임 메서드를 사용해볼 수 있습니다. Mapbox가 더 세밀한 콜백을 가지고 있기 때문에 Mapbox를 먼저 사용해 보겠습니다. -> MapKit.

GCD를 사용하여 dispatch_async()에 위임 콜백을 묶어 두지 않는 것이 좋습니다.

이 접근법은 완전히 부적절 할 수 있지만 나는 그것을 밖으로 버릴 것이라고 생각했습니다.

나는 공유 터치 이벤트에 많은 행운이 없을 것이라고 생각합니다.

+0

이것은 더 나은 대답 인 것 같습니다. https://github.com/mapbox/mbxmapkit – lostintranslation

관련 문제