iPhone: Détection Tap en MKMapView

voix
19

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

Créé 14/08/2009 à 03:22
source utilisateur
Dans d'autres langues...                            


8 réponses

voix
31

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.

Créé 31/12/2010 à 21:30
source utilisateur

Créé 10/11/2009 à 13:27
source utilisateur

voix
2

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 ...
     }
Créé 03/04/2015 à 10:46
source utilisateur

voix
2

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

Créé 18/09/2009 à 09:31
source utilisateur

voix
0

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.

Créé 16/09/2019 à 19:19
source utilisateur

voix
0

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)
}
Créé 20/09/2017 à 09:34
source utilisateur

voix
0

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
Créé 07/04/2017 à 13:59
source utilisateur

voix
0

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 ...

Créé 14/08/2009 à 03:59
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more