5

カスタム注釈を含む iOS アプリがあります。

  1. MKAnnotationView を 1 回タップしてコールアウトを表示できるようにしたい (正常に動作する)
  2. 次に、MKAnnotationView をもう一度タップして、注釈の選択を解除し、その注釈の吹き出しを非表示にします (iOS5 では機能しますが、iOS6 では機能しません)。

didSelectAnnotationView は、注釈の最初の選択のためにのみ呼び出されることになっていることを理解しています。([1]: Selecting a MapView Annotation Twice )、およびこの記事と私が読んだ他の記事 ([2]: ios mapkit Closing annotation callouts by tap the map ) に基づいて、MKAnnotationView の追加のタップを検出したように見えます。 UITapGestureRecognizer が必要です。

したがって、私は UITapGestureRecognizer を使用しており、注釈ビューが既に選択されているときに追加のタップを適切に検出しています。また、タップを認識したときに deselectAnnotation を呼び出しており、吹き出し/注釈を非表示/選択解除していますそれぞれ。iOS5では問題なく動作しますが、iOS6では半分しか動作しません

iOS6 では、タップ ジェスチャ認識エンジンが呼び出され、コードを呼び出して吹き出しを非表示にし、注釈の選択を解除するとすべて問題ありませんが、selectAnnotationView メソッドが何らかの形で呼び出されるため、吹き出しが再び表示され、注釈が再び選択されます。

私が想定しているのは、タップジェスチャ認識エンジンで注釈ビューの選択を解除した直後に、タップイベントがまだアクティブであり、mapView がタッチイベントを検出して selectAnnotationView を呼び出すことです。選択解除されたものが再び選択されます。

iOS6 でのみ発生する理由はわかりませんが、目的の動作を処理するための他のアイデアについて意見を求めています。

4

1 に答える 1

0

まだ問題が発生しているかどうかはわかりません (投稿が少し古いため、そうでないことを願っています)。しかし、一部の人々が同じ問題を抱えている場合、注釈の選択を解除し、mapKit が再選択するのを避けるための 1 つの解決策は、注釈の選択を解除する前に少し遅延を追加することです。

- (void)annotationTap:(UIGestureRecognizer *)gesture
{
    MKAnnotationView *mkav = (MKAnnotationView *)gesture.view;
    //Add a small delay to deselect
    [self performSelector:@selector(deselectAnnotation:)  withObject:mkav.annotation afterDelay:0.3];
    [gesture.view removeGestureRecognizer:gesture];
}


- (void)deselectAnnotation:(id<MKAnnotation>)annotation
{
    [self.mapView deselectAnnotation:annotation animated:YES];
}

ユーザーがマップ上の注釈の選択を解除した場合は、donMt forge をタップして、このコードでジェスチャを削除します

- (void) mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view {
         for (UIGestureRecognizer *recognizer in view.gestureRecognizers) {
             [view removeGestureRecognizer:recognizer];
         }
}
于 2013-09-05T09:44:37.657 に答える