2

私は、カスタムピンを埋め込んだマップビューで作業しています。ユーザーがマップのどこかをタップしてピンの選択を解除すると、ピンが選択解除されないようにマップを実装したい(つまり、ユーザーは他のピンを選択せず​​にピンの選択を解除できないため、常に少なくとも1つのピンが選択されます)。ここでdidDeselectAnnotationView方法の私の実装です:基本的にmapView:didDeselectAnnotationView:アノテーションビューが実際に選択解除される前に、デリゲートメソッドが呼び出される

-(void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view 
{ 
    [mapView selectAnnotation:view.annotation animated:NO]; 
} 

、私は注釈を再選択しようとしています。しかし、デバッグとコンソールへの印刷の後、私は、メソッドのdidDeselectAnnotationView:実行が終了するまで(つまり、イベントの順序が次のようになるまで)、アノテーションビューが実際には選択解除されていないことに気づきました。実行が終了すると、注釈ビューは実際には選択解除されます)。他の誰かがこの問題を経験したことがありますか、または他のピンを選択せず​​にピンの選択を解除できないように、ピンの動作を強制する別の方法を知っていますか?

ありがとうございました。

答えて

10

didDeselectAnnotationViewが終了した後までの再選択を延期してみてください。

-(void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view 
{ 
    [self performSelector:@selector(reSelectAnnotationIfNoneSelected:) 
      withObject:view.annotation afterDelay:0]; 
} 

- (void)reSelectAnnotationIfNoneSelected:(id<MKAnnotation>)annotation 
{ 
    if (mapView.selectedAnnotations.count == 0) 
     [mapView selectAnnotation:annotation animated:NO]; 
} 
+0

おかげで動作します!それは働いているようだ。 – Eli

+0

私にとってこれは 'annotationView.canShowCallout = false'の場合にのみ有効です –

0

私は同様の問題が、他の方法で回避していました。

選択されたピンに応じて、テーブルはそれぞれのセルにスクロールします。ピンが選択されていない場合、テーブルは最初のセルにスクロールします。他のピンが選択され、テーブルが必要に応じてスクロールしないときに、selectメソッドが呼び出されると同時に、deselectメソッドが呼び出されていました。

次のコードはこの問題を解決したもので、Annaのソリューションを少し修正したものです。

1

編集:この方法では、この回答が作成されたときに不明だった他のピンは選択できません。チャンスは、これはあなたが望む行動ではありません。

私はこれは古い質問ですが、iOS 8では受け入れられた答えがうまくいきませんでした。私にとっては、デフォルトではMKMapViewに含まれているUITapGestureRecognizerを完全に無効にしていました。

- (void)disableTapRecognizerForMapView:(MKMapView *)mapView { 
    NSArray *a = [[self.mapView.subviews objectAtIndex:0] gestureRecognizers]; 

    for (id gesture in a) 
     if ([gesture isKindOfClass:[UITapGestureRecognizer class]]) 
      [gesture setEnabled:NO]; 
} 

うまくいけば、これは他の人の役に立ちます。

乾杯!

+0

これを行うと、地図上で注釈を選択することはできません。あなたはどうしたのですか?gebirgsbä[email protected] –

+1

は、正直に言うと、私はそれを中心に得た方法/場合は覚えていないが、私のアプリで現在の動作は、ユーザーが何のピン選択がないようにすることである - 私は回避策を見つけることができませんでしたと思わせます。私はこの動作を反映するために答えを更新します。 – cohenadair

+0

すばやくお返事いただきありがとうございます –

0

アンナからの素晴らしい答え。スウィフト3または4で ここで答え:D

func mapView(_ mapView: MKMapView, didDeselect view: MKAnnotationView) { 
    perform(#selector(MyViewController.reSelectAnnotationIfNoneSelected(_:)), with: view.annotation, afterDelay: 0) 
} 

func reSelectAnnotationIfNoneSelected(_ annotation: MKAnnotation) { 
    if mapView.selectedAnnotations.count == 0 { 
     mapView.selectAnnotation(annotation, animated: false) 
    } 
} 
0

マップビューのためのジェスチャーを追加する場合は、この方法を試してください。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer; 

リターンNO、それは

関連する問題