web-dev-qa-db-ja.com

iPhone:MKMapViewでタップを検出

MKMapViewのインスタンスのシングルタップを検出するにはどうすればよいですか? MKMapViewをサブクラス化してから、touchesEndedメソッドをオーバーライドする必要がありますか?

ありがとう、

-クリス

23
ChrisJF
3
tt.Kilew

マップの他のタッチ動作に影響を与えずにタップジェスチャの通知を受け取りたいだけの場合は、UITapGestureRecognizerを使用することをお勧めします。とてもシンプルで、このようなコードを入れるだけです。

UITapGestureRecognizer* tapRec = [[UITapGestureRecognizer alloc] 
   initWithTarget:self action:@selector(didTapMap:)];
[theMKMapView addGestureRecognizer:tapRec];
[tapRec release];

これにより、didTapMapがタップジェスチャとすべてのピンチを受信するたびにtheMKMapViewが呼び出され、ドラッグジェスチャは以前と同じように機能します。

33
pseudopeach

IOS8で完璧に動作する

- (void)viewDidLoad 
    {
        [super viewDidLoad];

        UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:nil];
        doubleTap.numberOfTapsRequired = 2;
        doubleTap.numberOfTouchesRequired = 1;
        [self.mapView addGestureRecognizer:doubleTap];

        UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
        singleTap.numberOfTapsRequired = 1;
        singleTap.numberOfTouchesRequired = 1;
        [singleTap requireGestureRecognizerToFail: doubleTap];
        [self.mapView addGestureRecognizer:singleTap];
     }

   - (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer
     {
            if (gestureRecognizer.state != UIGestureRecognizerStateEnded)
                return;
            //Do your work ...
     }
3
Sanjeev Rao

または、実行しようとしていることに応じて、MKAnnotation(プッシュピン、コールアウト付き)を追加して、タップするものがあります。そうすると、マップデリゲートはイベントを受信します。

mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control

2
TimM

私が今まで見つけたものは何も機能しませんでしたが、私はこの不完全な解決策を思いつきました:viewDidLoadで

let singleTapRecognizer = UITapGestureRecognizer(target: self, action: #selector(onMapClicked))
singleTapRecognizer.delegate = self
mapView.addGestureRecognizer(singleTapRecognizer)

代議員:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
    return touch.view!.frame.equalTo(mapView.frame)
}
0
Livio

swit 5.xの私の2セント:

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    if let touch = touches.first {
        let v = touch.view
        let ssv = v?.superview?.superview
        if ssv === self.mapView{
            searchBar.resignFirstResponder()
        }
    }
}

できます。しかし、正直なところ、Appleがビューのレイヤーを変更すると、壊れることがあります。より良い認識機能です。

0
ingconti

@ tt-kilewの回答の例としてコードスニペットを追加するだけです。私の場合、ユーザーを地図上で自分自身に向けたいが、ドラッグタッチを中断したくない。

@interface PrettyViewController () <MKMapViewDelegate>

@property (weak, nonatomic) IBOutlet MKMapView *mapView;
@property (assign, nonatomic) BOOL userTouchTheMap;

@end

@implementation PrettyViewController

#pragma mark - UIResponder

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];

    self.userTouchTheMap = [[touches anyObject].view isEqual:self.mapView];
}


#pragma mark - MKMapViewDelegate

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation {
    //We just positioning to user
    if (!self.userTouchTheMap) {
        CLLocationDistance radius = 5000;
        [self.mapView setRegion:MKCoordinateRegionMakeWithDistance(userLocation.location.coordinate, 2*radius, 2*radius) animated:YES];
    }
}

@end
0
WINSergey

現時点では、マップビューのタッチをインターセプトすることはできません。不透明なビューをその上に重ねて、タッチを検出するかどうかを確認できます...

0
Daniel