3

カスタム ピンが設定されたマップ ビューを使用しています。ユーザーがマップのどこかをタップしてピンの選択を解除した場合、ピンの選択が解除されないようにマップを実装したいと考えています (つまり、ユーザーは他のピンを選択しないとピンの選択を解除できないため、少なくとも 1 つのピンが常に選択されます)。 )。これが didDeselectAnnotationView メソッドの私の実装です。

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

基本的に、注釈を再選択しようとしています。ただし、デバッグしてコンソールに出力した後、メソッド didDeselectAnnotationView: の実行が終了するまで、注釈ビューが実際には選択解除されていないことに気付きました (つまり、イベントの順序は次のようになります: ユーザーがマップ上のどこかをタップすると、 didDeselectAnnotationView: が呼び出されます)。実行が終了すると、注釈ビューは実際には選択解除されます)。他の誰かがこの問題を経験したことがありますか、またはユーザーが他のピンを選択しないとピンの選択を解除できず、常に 1 つのピンが選択されるように、マップの動作を強制する別の方法を知っている人はいますか?

助けてくれてありがとう。

4

5 に答える 5

11

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];
}
于 2011-08-03T19:54:43.847 に答える
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];
}

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

乾杯!

于 2015-04-04T19:55:55.420 に答える
0

同様の問題がありましたが、逆です。

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

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

- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKPinAnnotationView *)view
{
   if ([view.annotation isKindOfClass:[MKUserLocation class]]) 
        return;

    [self performSelector:@selector(resetTableScroll:) 
           withObject:view.annotation afterDelay:.5];
    }



- (void)resetTableScroll:(id<MKAnnotation>)annotation{

    if (theMap.selectedAnnotations.count == 0)
    {
        NSIndexPath *position = [NSIndexPath indexPathForRow:0 inSection:0];
        [[self theTable] scrollToRowAtIndexPath:position atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
    }}
于 2012-05-07T00:46:54.277 に答える