2014-04-16 4 views
3

UIScrollView에서 상속받은 MKMapViewUITableViewUICollectionView과 같습니다. 이 방법을 사용하면 UIScrollView 대리자 메서드를 무시하고 수행해야 할 작업을 수행 할 수 있습니다. 이것은 mapView가에 감속 요소가 있다는 사실을 제외하고 꽤 잘 작동MapView에서 스크롤을 감지합니다.

UIPanGestureRecognizer* mapPanGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(mapPanGestureHandler:)]; 
[mapPanGestureRecognizer setDelegate:self]; 
[self.mapView addGestureRecognizer:mapPanGestureRecognizer]; 

:

는 그래서 같은 MapView에 팬 제스처를 부착하는 방법을 발견했습니다. 예를 들어, 중 스크롤에서 손가락을 들어 올리면지도가 계속 움직이며 속도가 느려지고 결국 멈 춥니 다.

내가하고있는 일은 핵심 그래픽을 사용하여 내지도 (다른 UIView) 위에 오버레이에서 일부 오프 스크린 주석을 렌더링하는 것입니다. 감속 문제를 제외하고는 큰 효과가 있습니다.

내가 알아야 할 것은지도가 움직 였다는 것입니다. 필요한 매개 변수는지도 자체에서 직접 쿼리 할 수 ​​있습니다.

감속 중에 콜백을받는 기술을 발견 한 사람이 있습니까? 나는 제스처가 0.5 초 정도 반복적으로 발사 될 때 타이머를 사용할 수 있다고 생각합니다.

+0

지도가 이동하는 동안 또는 이동이 중지 된 경우에만 이동해야하는지 알고 싶습니까? – rdelmar

+0

손가락이 움직이는 지 여부에 관계없이 움직입니다. – VaporwareWolf

답변

10

MKMapView에는 UIScrollView에 대한 유사한 대리인 콜백이 없으므로 즉석에서해야합니다.

누가 감속하면서 콜백을받는 기술을 찾았습니까? 나는 제스처가 0.5 초 정도 반복적으로 발사 될 때 타이머를 사용할 수 있다고 생각합니다. 정확하게지도의 움직임과 동기화 전망을 유지하고자하는 경우 각 화면 새로 고침 후 콜백을받을 것이기 때문에

, 당신은 CADisplayLink를 사용하여 더 나을 수 있습니다. 반면에 타이머를 사용하면 콜백이 새로 고침 빈도와 일직선으로 정렬되지 않으며 아티팩트가 표시 될 수 있습니다.

CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(updateViewsBasedOnMapRegion:)]; 
[link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; 

을 그리고 다음과 같이 콜백 처리 :

이처럼 설정하는 것

- (void)updateViewsBasedOnMapRegion:(CADisplayLink *)link 
{ 
    // update whatever it is you need to update 
} 

당신은 독점적으로이 사용할 수 및 제스처 인식을 폐기 또는 제스처 인식기를 유지 필요한 경우 링크를 일시 중지하십시오.

+0

좋아요. 나는 아침에 그 시도를하기를 기다릴 수 없다. 나는 Timer 솔루션이 까다 롭다는 것에 동의하지만, 당신이 말한대로 ... 즉석. 나는 MapView.region 속성에서 KVO를 사용하려고 생각했습니다. 나는지도가 얼마나 자주 지역 변수를 업데이트하는지 잘 모르겠다. 나는 둘 다 시도 할 것이다. 감사합니다 – VaporwareWolf

+1

CADisplayLink는 나를 위해 문제를 해결했습니다. 냄비 제스처를 교체하고이 선택기의 대상을이 게시물의 코드로 대체합니다. 그것은 완벽하게 감속과 모든 작동합니다. – VaporwareWolf

0

MKMapViewDelegate 프로토콜은 맵에 의해 표시된 영역이 변경 될 때 호출 될 mapView:regionDidChangeAnimated:을 정의합니다. 맵이 스크롤되는 동안은 반복적으로 호출됩니다 -

토론이 방법은 때마다 현재 표시된지도 지역 변경이라고합니다. 스크롤하는 동안이 메서드를 여러 번 호출하여 업데이트를지도 위치에보고 할 수 있습니다. 따라서 이 메서드의 구현은 스크롤링 성능에 영향을 미치지 않도록 가능한 한 경량이어야합니다.

당신은 새로운지도 영역에 액세스하려면이 방법을 사용하여 오버레이를 다시 그려야 할 수 있어야한다 (또는 다시 그리기는 경우 시간이 많이 소요 오버레이를 다시 그리기 위해 다른 스레드에서 작업을 파견 수)

+2

'regionDidChangeAnimated'는 가끔씩 만 호출됩니다. 예를 들어 전체 화면을 가로 질러 이동하면 한 번 또는 두 번만 호출 될 수 있습니다. 질문에서, 나는 그가 더 빈번한 갱신을 찾고 있다는 것을 모았습니다. –

+0

아마도 제스처 인식기의 현재 접근법과 대리자 방법을 결합하면 제스처 인식기가 현재와 같이 대부분의 움직임을 캡처하고 감속 후 최종 업데이트를 위임받은 사람은 – Paulw11

+0

티모시가 정확합니다. 그 방법은 매우 드물다. 감속이 멈 추면 내 테스트가 시작됩니다. 자매 방법 인 "willChange"는 한 번만 호출됩니다. 내가 움직일 때지도에서 물체를 유동적으로 렌더링하기에 충분할 정도로 호출 될 무언가를 찾고있다. – VaporwareWolf

관련 문제