9

私のiPhoneアプリケーションでは、MapKitとMKMapViewおよびカスタムMKAnnotationViewを使用しています。

問題は、注釈が地図上で重なっている場合(私のアプリでは、注釈は写真であり、それらの写真が重なっている可能性があります)、前面に表示される注釈をタップすると、イベントを受け取る別の注釈(背面)です(ランダムに見える) )。

イベントをフロントアノテーションに送信する方法が見つかりませんでした。このバグ/問題に解決策がないなんて信じられません!

スタックオーバーフローに関するZの順序重複する注釈の順序の質問はあまり役に立ちませんでした。

どんなアイデアでも大歓迎です(汚い解決策でも)!

これが私のコードの一部です(派手なものはなく、非常に一般的です):

CustomAnnotation.h

@interface CustomAnnotation : NSObject <MKAnnotation> {
   @private
   CustomAnnotationView* view;
}

    @property (nonatomic, retain) CustomAnnotationView* view;

@end

CustomAnnotation.m

@implementation CustomAnnotation

@synthetize view;

CustomAnnotationView.h

@interface CustomAnnotationView : MKAnnotationView {
}

@end

CustomAnnotationView.m

@implementation CustomAnnotationView

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
// Do something related to the annotation tapped
}

@end

メインクラス...//注釈が追加され、それらの一部が他の注釈と重複しています。

- (void)addAnnotation:(CustomAnnotation*)annotation {
    [map addAnnotation:annotation];
}

...

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {

    NSString* identifier = getIdentifierFromAnnotation(annotation);
    CustomAnnotationView* view;
    if(!(view = (CustomAnnotationView*)[map dequeueReusableAnnotationViewWithIdentifier:identifier])) {
        view = [[CustomAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier: identifier];
        [(CustomAnnotation*)annotation setView:view];
        [view release];
    }
    return view;
}
4

4 に答える 4

2

最後に、私が見つけた最良の方法は、マップの機能を失うことを回避することです。

  • CustomAnnotationView(touchesEnded)のタッチリスナーに(各注釈で)

  • タッチイベントを受信したら、イベントをメインクラスに転送します

  • メインクラスは注釈をループし、適切な場所(注釈フレームのタッチイベント)があり、前面にある注釈を保持します

それはかなりうまくいきます。

于 2010-04-22T11:04:54.777 に答える
0

前面のビューにUITapGestureRecognizerを追加しましたが、これで問題が解決しました。

あなたの場合、CustomAnnotationViewにジェスチャレコグナイザーを追加すると問題が解決するはずです。

于 2011-12-15T14:04:45.167 に答える
0

この質問の解決策を参照してください。基本的に、すべてのタッチをインターセプトする透過的なUIViewを作成します。私は試していませんが、MKMapViewのすべてのピンチツーズーム機能を再実装する必要がある場合、これは価値があるよりも厄介かもしれません。

2つ(またはそれ以上)のMKAnnotationsが同じ場所にある場合は、繰り返しタップして2つを切り替えることができます。これは、アプリを変更しなくても機能するはずです。

于 2010-04-21T14:04:53.630 に答える
0

アレクサンドルの答えに続いて、私はすべてのカスタムMKAnnotationViewsオブジェクトを無効にしました

annView.enabled = NO

そのため、MKMapViewのデフォルトの選択動作に応答せず、カスタムMKAnnotationViewに次のように実装されています。

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
 self.enabled = YES;
 [(MKMapView*)self.superview selectAnnotation:self.annotation animated:NO];
}

このソリューションはiOS4でうまく機能します。MKAnnotationViewを無効にしてもuserInteractionEnabledは無効にならないようですが、iOS3では無効になります。iOS3のソリューションをまだ探しています...

編集:実際には、これはiOS4.1のバグのようです。iOS 4.2では、ピンを無効にするとタッチイベントも無効になります。したがって、この方法は4.1および場合によっては4.0でのみ機能します。

于 2010-10-21T05:47:47.930 に答える