Salutations encore!
Plus récemment, j'ai publié un article littéralement saturé d'amour pour Yandex.Maps. Le poème. Ode. Ici, en fait, elle
habr.com/en/post/479102Après m'être assuré que parmi les programmeurs il y a peu d'amateurs de poésie, j'ai néanmoins décidé d'éclairer la situation de manière plus «HABRovsky». Capturez un tas de code, de pensées et de captures d'écran. Allons-y.

Commençons à nouveau.
La tâche est triviale:
lorsque vous entrez dans le contrôleur avec les cartes, vous devez immédiatement «faire un zoom arrière» sur le point de l'utilisateur (bonus: vous devrez également obtenir l'adresse sous une forme lisible avec tous les atibutes disponibles).Nous avons coupé l'analyste: "Diviser pour régner".Pour atteindre cet objectif, il est nécessaire de résoudre un certain nombre de problèmes techniques et commerciaux, à savoir:
0. Accédez au contrôleur avec un module potentiel pour travailler avec le géo-positionnement (MRSG), les rappels, etc.
1. IWG
1.1 Mettre en œuvre l'IWG
1.2 Lancer IWG
1.2.1 Obtenir les coordonnées de l'utilisateur
1.2.2 Regardez-le
2 *. Obtenez l'adresse de position dans un format lisible.
Passage au contrôleur (VIPER + Configurateur)
extension AddPresenter: AddPresentationLogic {
Le délégué n'a qu'une seule fonction de sorte que lorsque vous spécifiez le point souhaité, vous pouvez le renvoyer via un protocole au contrôleur qui appelle le contrôleur avec la carte:
protocol YandexMapSetPointViewControllerProtocol { func didSelectPoint(_ place: Place) }
Au délégué, nous envoyons la partie contrôle du code appelant. Tout semble clair ici.
C'est ainsi que nous allons sans prétention au contrôleur ...

Le réticule au centre est situé exactement au centre du contrôleur et au centre des cartes UIView. L'hypothèse selon laquelle le zoom à l'intérieur des cartes fonctionnera par défaut au centre de la fenêtre. Et il s'est avéré.
À gauche et juste en dessous du réticule - UILabel. Il est prévu d'y afficher une adresse lisible. Bouton droit avec UIActivityIndicator. Le fait est que jusqu'à ce que les coordonnées de l'utilisateur soient arrivées, il "tourne" et le bouton est assombri et désactivé. En cliquant sur le bouton avec les coordonnées reçues de l'utilisateur, nous lui rendons le réticule.
Il s'agit d'une indication de la position, à partir de la position de l'utilisateur.En bas se trouve le bouton "Select Point". En cliquant, la magie de la logique métier se produit:
@IBAction func selectButtonWasPressed(_ sender: Any) { let place = Place() place.name = " " place.point.latitude = "\(String(describing: selectedPoint!.latitude))" place.point.longitude = "\(String(describing: selectedPoint!.longitude))" place.addressText = selectedPointGeocoderedAddress delegate?.didSelectPoint(place) navigationController?.popViewController(animated: true) }
Hourra! Nous avons discuté de la phase préparatoire!Nous passons au MRSG.
Vous trouverez ci-dessous un texte sous forme de tableau qui reflète
personnellement mes évaluations (avec des éléments flous) des modules de carte intégrés les plus célèbres (à l'époque je ne connaissais pas
www.openstreetmap.org , merci,
daglob ).

«La tâche étant simple, j'utilise Yandex.Maps. Ils sont beaux, agiles ... "- pensai-je.
Si vous êtes intéressé par la façon de configurer cela, écrivez un mini-projet, mais si vous êtes trop paresseux -
tech.yandex.ru/maps/mapkit/?from=mapsapi , prenez la trace de mon chemin. Commencer est facile.
Le fait est que la documentation est présentée sous cette forme:

Faites attention à la maigre description et à l'énorme liste d'objets à gauche. Maudit soit ta jambe.
"Le projet de test répondra probablement à mes questions." Et bien.
Voici cette bête.
github.com/yandex/mapkit-ios-demoJe n'y ai pas vu de solutions pour ma tâche triviale.
- D'accord, - je pense - j'ai assez d'expérience, si je ne suis pas développeur.

J'ai assemblé un projet de test et j'ai étudié la fonctionnalité de personnalisation du marqueur de l'utilisateur pendant longtemps.
Points clés:
Il y a un objet:
@IBOutlet weak var mapView: YMKMapView!
"Tout semble être logique", dites-vous. Mais non. Méthodes alternatives:
func onObjectAdded(with view: YMKUserLocationView) {} func onObjectRemoved(with view: YMKUserLocationView) {} func onObjectUpdated(with view: YMKUserLocationView, event: YMKObjectEvent) {}
nous avons la possibilité d'arriver à point.lat et point.long de manière extrêmement difficile.
Par exemple, comme ceci:
userLocation = YMKPoint(latitude: view.pin.geometry.latitude, longitude: view.pin.geometry.longitude)
Le temps d'attente pour les coordonnées de chargement varie avec cette approche de 2 à 50 secondes.
"Vous vous trompez, il doit y avoir un LocationManager concentré", me dis-je. Comme il s'est avéré plus tard - en effet, un tel "ami" est dans la documentation ... MAIS OERE EST UN EXEMPLE AVEC LUI?!?
Dans l'exemple de projet, il n'y a pas d'exemple d'application d'un tel gestionnaire:

- Eh bien, la documentation, il ne vous reste que vous et moi.
- Oui, il n'y a pas de problème, "innovateur", profitez:

Nous souscrivons l'UIViewController au protocole (j'espère qu'il n'y a pas besoin d'expliquer davantage quoi que ce soit ici, enfin, vraiment, les gars):
Et ...

1-15 secondes, CARL! 15! Parfois, cela fonctionne plus rapidement avec l'option précédente! Comment ça ??
Yandex, quelle blague? Tant de temps à consacrer à tout essayer et à obtenir un tel résultat - enfin, c'est généralement triste.
J'ai pensé, pensé ... Enfin, pas vraiment pareil. Donnez à une personne un contrôleur avec des cartes et mettez-le dans la stupeur lorsque vous passez dessus pendant plus de 4 secondes - c'est un suicide pour l'application. Personne n'attendra plus de 5 secondes en toute confiance que cela est confortable (si vous ne me croyez pas, écoutez les rapports de Vitaliy Fridman sur UI / UX).
Je pensais plus ... et l'émotion suivante était la suivante:
Qui veut du son - www.youtube.com/watch?v=pTZaNHZGsQoLa recette du succès était la suivante:
Prenez un
kilo ... CLLocationManager et YMKLocationManager et ... faites-les fonctionner ensemble.

Ce «travail» conjoint ressemble à ceci:
... et le pilaf est prêtLe résultat de la vitesse d'obtention du point de l'utilisateur: un peu plus de 0 seconde.
Le cas même où (à mon avis) lors de la résolution d'un problème trivial, l'opposition des parties natives et intégrées ressemblait à ceci:

Le résultat du travail visuellement est le suivant:

Résumant ce qui précède:
collègues, l'article est écrit de telle sorte que lorsque vous résolvez un tel problème, vous ne passez pas autant de temps que moi et choisissez un chemin différent ou parcourez-le rapidement.
J'aimerais voir des critiques constructives et / ou des solutions alternatives
correctes .
Si l'article s'est avéré utile pour vous, corrigez-moi avec une note Lois et, de préférence, consultez la
version originale de cette histoire d'une nouvelle manière.
Tout succès créatif et humeur positive!