2009-11-05 5 views
13

MKMapKit의 한계에 상당히 좌절감을 느낍니다. 현재의 문제는 주석보기의 z- 순서와 관련이 있으며, 특히 터치와 관련이 있습니다. 기본 z 순서를 사용하면 mapkit에서 다음을 제공합니다.MKAnnotationViews의 Z 순서 지정

  1. 주문이 임의로 표시됩니다. z 순서는 주석이 추가 된 순서와 관련이 없습니다.
  2. 하나의 특수 효과가 다른 특수 효과의 위에 놓이면 상위 특수 효과를 터치하면 일반적으로 아래쪽 특수 효과에 대한 설명 선이 나타납니다. 히트 감지가 그리기 순서를 존중하지 않는 것처럼 보입니다. 그게 뭐야?

나는 전달 된 주석 뷰를 통해 실행

 
- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views { 
    for (MKAnnotationView * annView in views) { 
     TopBottomAnnotation * ann = (TopBottomAnnotation *) [annView annotation]; 
     if ([ann top]) { 
     [[annView superview] bringSubviewToFront:annView]; 
     } else { 
     [[annView superview] sendSubviewToBack:annView]; 
     } 
    } 

} 

(z 순서를 통해 제어 할 수 있도록 설계되었습니다) 웹에있는 다음 코드와 유사한 것을 사용 # 1를 해결하려고했습니다 mapView : didAddAnnotationViews : 그리고 그들의 z 순서를 조정하면 # 1을 수정하는 것 같습니다. 문제는 이제 설명 선보기가 더 이상 항상 주석보기의 맨 위에 있지 않다는 것입니다. MapKit은 레이어에 대해 매우 혼란스러워 보입니다 (콜 아웃은 모든 주석 뷰 위에 레이어로 그려야 함). 내가받는 모든 MKAnnotationViews가 동일한 수퍼 뷰 (개인 클래스 MKOverlayView)를 가지고 있기 때문에 어떻게 혼란스러워하는지 알 수 있습니다. 어떤 합리적인 디자인이라도이 오버레이보기에 대한 설명 선을 그릴 것이라고 생각할 것입니다.

# 1 또는 # 2를 성공적으로 해결 한 사람이 있습니까?

+0

어디에서 TopBottomAnnotation 클래스를 얻었습니까? –

+0

TopBottomAnnotation은 annotationview 클래스의 이름입니다. –

+1

... 거의 6 년 후에 같은 문제가 발생합니다. 어떻게 수정되지 않았습니까? – Tys

답변

8

당신이 (당신이 이미 가지고있는 것처럼 소리) 사용자 정의 annotationView 추가하려는 시도 할 수있는 경우이 :

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [self.superview bringSubviewToFront:self]; 
    [super touchesBegan:touches withEvent:event]; 
} 

부작용은 마커도를 터치 할 때마다이 전면에 나올 것입니다 그것이 사용자가 초점을 맞추고 있기 때문에 실제적으로 의미있는 z 순서입니다.

+0

라민, 응답 해 주셔서 감사합니다. 나는 그것이 내 문제를 해결할 것이라고는 생각하지 않는다. 어노테이션 뷰 위에 표시되지 않는 것은 콜 아웃입니다. 사용자가 터치하지 않고도 주석 뷰의 z 순서를 제어해야합니다. 일부보기는 더 높은 "우선 순위"를 가지며 다른 우선 순위가 낮은보기 위에 표시되어야합니다. – btschumy

+0

같은 문제인지 모르겠지만 마커 핀을 가까이에 배치해야했습니다.각 핀을 탭하면 설명 선이 다른 핀 아래에 표시되므로 각 주석보기가 자체 설명 선 레이어를 유지 관리하는 것처럼 보입니다. 하지만 당신 말이 맞아요, 콜 아웃은 자신의 최상위 레이어에 있어야합니다. bugreport를 제출할 수 있습니다. – Ramin

+0

Ramin, 방금 ​​솔루션을 사용해 보았지만 실제로 모든 주석 위에 표시되지 않는 콜 아웃 문제를 해결합니다. 감사. 여전히 겹치는 부분에 주석이 붙는 문제가있는 것으로 보입니다. 하지만 다른 문제보다 덜 중요합니다. – btschumy

7

라민, 내가하려는 일에 완벽합니다. 내가 정의한 커스텀 어노테이션 뷰가 없다. 카테고리를 사용하여이 문제를 해결했으며 완벽하게 작동했습니다.

#import <Foundation/Foundation.h> 
#import <MapKit/MapKit.h> 


@interface MKPinAnnotationView (ZIndexFix) 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; 
@end 

그리고 구현 :

(:

#import "AEBMapViewCategory.h" 
@implementation MKPinAnnotationView (ZIndexFix) 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [self.superview bringSubviewToFront:self]; 
    [super touchesBegan:touches withEvent:event]; 
} 
@end 
+0

우수 ... 그게 내가 좋은 코드라고 부르는 것입니다. – Biranchi

+0

mapViewForAnnotations 또는 이보다 더 일반적으로 mapview 응용 프로그램의 나머지 부분과 어떻게 조화를 이루어야합니까? 미안해, 나에게 분명하지 않아. – si28719e

+0

와우. 그래서 이건 '그냥 일하는 것'처럼 보입니다. 그것은 꽤 훌륭합니다. 그러나 저는 여전히 '왜'를 알고 싶습니다. 그리고 나는 전혀 모른다. – si28719e

6

다른 솔루션에 설치 주석보기 층의 zPosition (annotationView.layer.zPosition) 시도 여기

헤더입니다 void) mapView : (MKMapView *) mapView didAddAnnotationViews : (NSArray *) 뷰;

+0

올바른 방법 – rmvz3