14

MKMapKit の制限にかなり不満を感じています。私の現在の問題は、特にタッチに関連する注釈ビューの z オーダーに関係しています。デフォルトの z オーダーを受け入れると、マップキットは次のように表示します。

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

Web で見つかった次のコードに似たものを使用して #1 を解決しようとしました (これは、z オーダーをある程度制御できるように設計されています)。

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
   for (MKAnnotationView * annView in views) {
      TopBottomAnnotation * ann = (TopBottomAnnotation *) [annView 注釈];
      if ([アントップ]) {
         [[annView スーパービュー] BringSubviewToFront:annView];
      } そうしないと {
         [[annView スーパービュー] sendSubviewToBack:annView];
      }
   }

}

mapView:didAddAnnotationViews: に渡された注釈ビューを実行し、それらの z オーダーを調整すると、#1 が修正されるようです。問題は、吹き出しビューが常に注釈ビューの上に表示されなくなったことです。MapKit は、レイヤーについて非常に混乱しているようです (コールアウトは、すべての注釈ビューの上のレイヤーに描画する必要があります)。受信したすべての MKAnnotationView が同じスーパービュー (プライベート クラス MKOverlayView) を持っているため、どのように混乱しているのかを理解することさえできます。妥当な設計であれば、このオーバーレイ ビューに関するコールアウトを描画すると考えるでしょう。

#1 または #2 をうまく解決した人はいますか?

4

3 に答える 3

8

カスタムの annotationView がある場合 (既に持っているように聞こえます)、これを追加してみてください:

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

副作用として、マーカーがタッチされるたびに z オーダーの前にポップされます。これは、ユーザーが焦点を合わせているものであるため、実際には賢明です。

于 2009-11-05T16:54:34.953 に答える
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
于 2009-12-04T18:40:27.683 に答える
6

別の解決策を試して、注釈ビュー レイヤーの zPosition (annotationView.layer.zPosition) を次のように設定します。

(void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views;

于 2013-05-03T11:12:52.157 に答える