のインスタンスで 1 回のタップを検出するにはどうすればよいMKMapView
ですか? メソッドをサブクラス化してからMKMapView
オーバーライドする必要がありますtouchesEnded
か?
ありがとう、
-クリス
のインスタンスで 1 回のタップを検出するにはどうすればよいMKMapView
ですか? メソッドをサブクラス化してからMKMapView
オーバーライドする必要がありますtouchesEnded
か?
ありがとう、
-クリス
マップの他のタッチ動作に影響を与えずにタップ ジェスチャの通知を受け取るだけの場合は、UITapGestureRecognizer
. これは非常に簡単で、次のようなコードを挿入するだけです。
UITapGestureRecognizer* tapRec = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(didTapMap:)];
[theMKMapView addGestureRecognizer:tapRec];
[tapRec release];
これにより、タップ ジェスチャとすべてのピンチおよびドラッグ ジェスチャを受け取るdidTapMap
たびに が呼び出され、以前と同様に機能します。theMKMapView
または、何をしようとしているのかに応じて、MKAnnotation
(押しピン、コールアウト付き) を追加して、タップするものを用意します。すると、マップ デリゲートはイベントを受け取ります。
mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
iOS 8 で完璧に動作
- (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 ...
}
これが役立つことを願っています: MKMapView または UIWebView オブジェクトのタッチ イベントをインターセプトする方法は?
現時点では、マップビューのタッチをインターセプトすることはできません。その上に不透明なビューを重ねて、タッチを検出するかどうかを確認できます...
@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