déterminer si MKMapView a été glissé/déplacé
Est-il un moyen pour déterminer si un MKMapView a été traîné?
Je veux obtenir le centre de l'emplacement à chaque fois qu'un utilisateur fait glisser la carte à l'aide CLLocationCoordinate2D centre = [locationMap centerCoordinate];
mais j'aurais besoin d'une méthode du délégué ou de quelque chose qui se déclenche dès que l'utilisateur navigue autour de la carte.
Merci d'avance
Vous devez vous connecter pour publier un commentaire.
Regarder la MKMapViewDelegate de référence.
Spécifiquement, ces méthodes peuvent être utiles:
Assurez-vous que votre carte afficher le délégué de la propriété est définie de sorte que ces méthodes appelées.
- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
a fait le travail.Le code de la accepté de répondre à feux lorsque la région est modifié pour une raison quelconque. Détecter correctement une carte, faites glisser que vous avez à ajouter un UIPanGestureRecognizer. Btw, c'est le geste de reconnaissance (panoramique = glisser).
Étape 1: Ajouter le geste de reconnaissance dans le viewDidLoad:
Étape 2: Ajouter le protocole UIGestureRecognizerDelegate à la vue-contrôleur de sorte qu'il fonctionne en tant que délégué.
Étape 3: Et ajoutez le code suivant pour le UIPanGestureRecognizer de travailler avec l'existant geste modules de reconnaissance dans MKMapView:
Étape 4: Dans le cas où vous souhaitez appeler votre méthode une fois au lieu de 50 fois par glisser, de détecter que "glisser-clos" de l'état dans votre sélecteur:
mapView:regionDidChangeAnimated:
, qui est appelée que si la carte de la région est modifiée par programme (dans mon cas, je veux seulement savoir si l'utilisateur fait défiler manuellement la carte). Merci de poster!UIPinchGestureRecognizer
ainsireadyForUpdate
, puis vérifiez que l'indicateur dans- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
.C'est la seule qui a fonctionné pour moi qui détecte panoramique ainsi qu'un zoom changements initiés par l'utilisateur:
MKMapView
dans iOS. Que la mise en œuvre pourrait changer en toute mise à jour d'iOS depuis il ne fait pas partie de l'API.(Seulement) Swift version de @mobi est une excellente solution:
self.mapView.subviews[0]
àself.mapView.subviews[0] as! UIView
self.map.delegate = self
à viewDidLoadSwift 3 solution à Jano réponse ci-dessus:
Ajouter le Protocole UIGestureRecognizerDelegate à votre ViewController
Créer le UIPanGestureRecognizer dans
viewDidLoad
et définirdelegate
à l'autoAjouter un mode de Protocole de sorte que votre geste de reconnaissance va travailler avec l'existant MKMapView gestes
Ajouter la méthode qui sera appelée par le sélecteur dans votre casserole geste
Une autre solution possible est de mettre en œuvre touchesMoved: (ou touchesEnded:, etc.) de l'avis du contrôleur qui détient votre vue de la carte, comme suit:
Ce qui pourrait être plus simple que d'utiliser des modules de reconnaissance de geste, dans certains cas.
Dans mon expérience, similaire à la "recherche en cours de frappe", j'ai trouvé une minuterie est la solution la plus fiable. Il supprime la nécessité pour l'ajout de modules de reconnaissance de geste pour le panoramique, pincement, rotation, à tarauder, à double taraudage, etc.
La solution est simple:
Lorsque le compte à rebours incendies, de la charge de marqueurs pour la nouvelle région
Vous pouvez également ajouter un geste de reconnaissance pour votre carte dans Interface Builder. Lien à une prise de courant pour son action dans le viewController, j'ai appelé le mien "mapDrag"...
Alors vous allez faire quelque chose comme ceci dans votre viewController de l' .m:
Assurez-vous que vous avez ce là aussi:
Bien sûr, vous aurez à faire votre viewController un UIGestureRecognizerDelegate dans votre .h dans le fichier pour que cela fonctionne.
Sinon la carte du répondeur est le seul qui entend le geste de l'événement.
UIGestureRecognizerStateBegan
Beaucoup de ces solutions sont sur le hacky /pas de ce que Swift destiné côté, j'ai donc opté pour une solution plus propre.
J'ai simplement sous-classe MKMapView et remplacer touchesMoved. Alors que cet extrait ne pas l'inclure, je recommande la création d'un délégué ou d'une notification de transmettre toutes les informations que vous voulez concernant le mouvement.
Vous aurez besoin de mettre à jour la classe de votre storyboard fichiers point à la présente sous-classe, ainsi que de modifier toutes les cartes que vous créez par d'autres moyens.
Vous pouvez vérifier pour l'animation de la propriété
si la valeur est false alors l'utilisateur traîné carte
De reconnaître quand tout geste est terminée sur la mapview:
http://b2cloud.com.au/tutorial/mkmapview-determining-whether-region-change-is-from-user-interaction/
C'est très utile que pour l'exécution d'une requête de base de données après que l'utilisateur se fait de zoom/rotation/faire glisser la carte autour de.
Pour moi, le regionDidChangeAnimated méthode est appelée après que le geste a été fait, et n'est pas appelée à de nombreuses reprises tout en faisant glisser/zoom/rotation, mais il est utile de savoir si elle était due à un geste ou pas.
Jano réponse a fonctionné pour moi, alors j'ai pensé que je l'avais quitter une version mise à jour pour Swift 4 /XCode 9 que je ne suis pas particulièrement compétent en Objective C, et je suis sûr qu'il ya quelques autres qui ne sont pas non plus.
Étape 1: Ajouter ce code dans le viewDidLoad:
Étape 2: assurez-vous que votre classe est conforme à la UIGestureRecognizerDelegate:
Étape 3: Ajoutez la fonction suivante pour vous assurer que votre panGesture vais travailler simultanément avec d'autres gestes:
Étape 4: Et en veillant à ce que votre méthode n'est pas appelée "50 fois par glisser" comme Jano le souligne à juste titre:
*Notez l'ajout de @objc dans la dernière étape. XCode va forcer ce préfixe sur votre fonction dans l'ordre pour qu'il compile.
entrez le code hereI réussi à faire mettre en œuvre ce de manière la plus facile, qui gère toutes les interactions avec la carte (taraudage/double/N tapant avec 1/2/N doigts, casserole avec 1/2/N doigts, pincer et les rotations
gesture recognizer
et les ajouter à la carte afficher le conteneurgesture recognizer's
delegate
à un objet la mise en œuvre deUIGestureRecognizerDelegate
gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch)
méthodeJ'essayais d'avoir une annotation dans le centre de la carte qui est toujours au centre de la carte, ce qui les utilise ne. J'ai essayé plusieurs approches mentionnées ci-dessus, et aucun d'eux n'était assez bon. J'ai finalement trouvé une façon très simple de résoudre ce problème, des emprunts auprès de la fondation Anna réponse et en les combinant avec Eneko de réponse. Il traite essentiellement de la regionWillChangeAnimated comme le début d'un glissement, et regionDidChangeAnimated comme la fin d'une, et utilise un timer pour mettre à jour le code pin en temps réel:
Première, assurez-vous que votre vue-contrôleur est un délégué de la carte. Afin de configurer votre Carte Afficher le délégué à l'auto et d'ajouter
MKMapViewDelegate
à votre vue-contrôleur. L'exemple ci-dessous.Et les ajouter à votre carte afficher le
Deuxième, ajoutez cette fonction qui est déclenché lorsque la carte est déplacée. Il va filtrer les animations et feu si interagi avec.
Je sais que c'est un vieux post, mais voici mon Swift 4/5 code de Jano réponse de pentecôte Pan et une Pincée de gestes.
Profitez-en!