2009-11-05 9 views
13

MKMapKitの制限にかなり不満を感じています。私の現在の問題は、注釈ビューのzオーダリングと関連しています。特にタッチに関連しています。あなたがデフォルトのzオーダーを受け入れるなら、mapkitはあなたに次のものを与えます:MKAnnotationViewsのZオーダー

  1. 注文はランダムに表示されます。 zオーダーは、注釈が追加された順序とは無関係です。
  2. 1つの注釈が別の注釈の上に表示される場合は、通常、上部注釈をタッチすると、下部注釈の吹き出しが表示されます。ヒット検出が描画命令を尊重しないようだ。どうしたの?

私は渡された注釈ビューを走る

 
- (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]; 
} 

副作用は、マーカーはまた、それをタッチするたびに目の前に飛び出していることですこれはユーザーが焦点を当てているので実際には合理的です。

+0

ラミン、 お返事ありがとうございます。私はそれが私の問題をかなり解決するとは思わない。アノテーションビューの上に表示されていない吹き出しです。 私はまた、ユーザーが触れることなく、注釈ビューのこのzオーダーを制御する必要があります。ビューの中には「優先度」が高く、他の優先度の低いビューの上に表示する必要があります。 – btschumy

+0

同じ問題があるのか​​どうかは分かりませんが、私は近くにマーカーピンをたくさん置いていました。各ピンをタップすると、他のピンの下に吹き出しが表示されるので、各注釈ビューには独自の吹き出しレイヤーが維持されているように見えます。しかし、あなたが正しいです、コールアウトは、自分の最上位層にする必要があります。バグレポートを提出したいかもしれません。 – 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

関連する問題