mkpinannotationViewのダブル選択タッチ
-
26-10-2019 - |
質問
編集:タイトルを次のように変更しました: "double tap .."から "double selection touch .."
アプリのmkpinannotationViewで少なくとも2回目のタッチを検出する必要があります。現在、私は最初のタッチを得ることができます(私はここからKVOを使用しています: mkmapviewでmkannotationが選択されたときに検出します)、そしてそれは最初のタッチでうまく機能します)が、ピンをもう一度タップすると、選択された値が変更されないため、何も呼ばれません。 「mapview:didselectannotationView:」を使用して同じことを試みましたが、それはiOS 4以来機能しますが、2回目のタップでも再び呼び出されません。
誰かがこれで私を助けることができれば、それは素晴らしいでしょう!
よろしくお願いします
編集、情報を追加:
したがって、ユーザーがピンに触れた場合、タイトルのタイトルとアノテーションの字幕にメッセージを表示する場合、ユーザーが同じピンにもう一度触れると、タッチが迅速である必要はありません。
解決
aを作成します UITapGestureRecognizer
とセット numberOfTapsRequired
に 2
. 。このジェスチャー認識者をあなたのインスタンスに追加します MKPinAnnotationView
. 。さらに、コントローラーをジェスチャー認識者の代表として設定し、実装する必要があります -gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:
そして戻る YES
ジェスチャーの認識者が内部で使用されているものを踏みにじらないようにするため MKMapView
.
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation)annotation
{
// Reuse or create annotation view
UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTapRecgonized:)];
doubleTap.numberOfTapsRequired = 2;
doubleTap.delegate = self;
[annotationView addGestureRecognizer:doubleTap];
}
- (void)doubleTapRecognized:(UITapGestureRecognizer *)recognizer
{
// Handle double tap on annotation view
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gesture shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGesture
{
return YES;
}
編集: 申し訳ありませんが、誤解しました。あなたが説明していることは、使用できるはずです -mapView:didSelectAnnotationView:
必要なタップのみで構成されたジェスチャー認識器。アイデアは、ジェスチャー認識者が選択されたときに注釈ビューにのみ追加するということです。注釈ビューが選択されたときに削除します。これにより、ズームインを処理できます -tapGestureRecognized:
方法と、注釈がすでにタップされている場合にのみ実行されることが保証されています。
このために、私はあなたのクラスのプロパティとしてジェスチャー認識者を追加し、それをで構成します -viewDidLoad
. 。それが宣言されていると仮定します @property (nonatomic, strong) UITapGestureRecognizer *tapGesture;
そして、私たちがアークを使用していること。
- (void)viewDidLoad
{
[super viewDidLoad];
self.tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureRecognized:)];
}
- (void)tapGestureRecognized:(UIGestureRecognizer *)gesture
{
// Zoom in even further on already selected annotation
}
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)annotationView
{
[annotationView addGestureRecognizer:self.tapGesture];
}
- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)annotationView
{
[annotationView removeGestureRecgonizer:self.tapGesture];
}