Comment puis-je détecter une simple pression sur une instance de MKMapView? Est - ce que je dois sous - classe MKMapView, puis remplacer la touchesEndedméthode?
Merci,
-Chris
Comment puis-je détecter une simple pression sur une instance de MKMapView? Est - ce que je dois sous - classe MKMapView, puis remplacer la touchesEndedméthode?
Merci,
-Chris
Si vous êtes à la recherche pour être averti des gestes de robinet sans affecter l'autre comportement tactile de la carte, vous aurez envie d'utiliser un UITapGestureRecognizer. Il est super simple, il suffit de mettre dans un code comme celui - ci.
UITapGestureRecognizer* tapRec = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(didTapMap:)];
[theMKMapView addGestureRecognizer:tapRec];
[tapRec release];
Qui appellera la didTapMapchaque fois theMKMapViewreçoit un geste du robinet et tous les pincements, et en faisant glisser les gestes seront encore travailler comme ils le faisaient auparavant.
Espérons que cela vous aidera: Comment intercepter des événements petites touches sur un objet ou MKMapView UIWebView?
Travailler parfaitement sur 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 ...
}
Ou en fonction de ce que vous essayez de faire, ajoutez un MKAnnotation(punaise, avec une légende), de sorte que vous avez quelque chose à taper sur - puis votre délégué carte recevra un exemple d'événement.
mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
mes 2 cents pour 5.x Swit:
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()
}
}
}
Ça marche. mais honnêtement peut briser si des changements pomme couches de vues. mieux un reconnaisseur.
Rien que j'ai jamais trouvé travaillé, mais je suis venu avec cette solution unperfect: En viewDidLoad
let singleTapRecognizer = UITapGestureRecognizer(target: self, action: #selector(onMapClicked))
singleTapRecognizer.delegate = self
mapView.addGestureRecognizer(singleTapRecognizer)
En délégué:
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
return touch.view!.frame.equalTo(mapView.frame)
}
Il suffit d'ajouter un peu extrait de code comme exemple de réponse @ tt-kilew. Dans mon cas, je tiens à l'utilisateur de se sur la carte, mais ne veux pas interrompre sa touche de glisser.
@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
Tu ne peux pas à cette interception du temps touche à une vue sur la carte, vous pouvez essayer superposant une vue opaque là-bas et voir si elle prend des touches ...