Saudações de novo!
Mais recentemente, publiquei um artigo literalmente saturado de amor pelo Yandex.Maps. O poema. Ode. Aqui, de fato, ela
habr.com/en/post/479102Tendo me assegurado de que há poucos amantes da poesia entre os programadores, decidi esclarecer a situação de uma maneira mais "HABRovsky". Pegue um monte de código, pensamentos e capturas de tela. Vamos lá

Vamos começar de novo.
A tarefa é trivial:
quando você entra no controlador com os cartões, precisa "espremer" imediatamente para o ponto do usuário (bônus: você também precisa obter o endereço de forma legível, juntamente com todos os atributos disponíveis).Cortamos o analista: "Divida e conquiste".Para atingir esse objetivo, é necessário resolver vários problemas técnicos e de negócios, a saber:
0. Vá para o controlador com um módulo em potencial para trabalhar com posicionamento geográfico (MRSG), retornos de chamada etc.
1. IWG
1.1 Implementar o IWG
1.2 Iniciar o IWG
1.2.1 Obter coordenadas do usuário
1.2.2 Dê uma olhada nele
2 *. Obtenha o endereço da posição em um formato legível.
Mudando para o controlador (VIPER + Configurator)
extension AddPresenter: AddPresentationLogic {
O delegado possui apenas uma função para que, quando você especificar o ponto desejado, possa devolvê-lo via protocolo ao controlador que chama o controlador com o cartão:
protocol YandexMapSetPointViewControllerProtocol { func didSelectPoint(_ place: Place) }
Para o delegado, enviamos a parte de controle do código de chamada. Tudo parece estar claro aqui.
É assim que despretensioso vamos ao controlador ...

A mira no centro está localizada exatamente no centro do controlador e no centro dos mapas do UIView. A suposição de que o zoom dentro dos mapas funcionará por padrão no centro da janela. E assim acabou.
À esquerda e logo abaixo da mira - UILabel. Está planejado exibir um endereço legível lá. Botão direito com UIActivityIndicator. O ponto é que, até que as coordenadas do usuário cheguem, ele "gira" e o botão fica escuro e desativado. Ao clicar no botão com as coordenadas recebidas do usuário, devolvemos a cruz para ele.
Esta é uma indicação da posição, começando pela posição do usuário.Na parte inferior está o botão "Selecionar ponto". Ao clicar, a mágica da lógica de negócios ocorre:
@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) }
Viva! Discutimos a fase preparatória!Prosseguimos para o MRSG.
Abaixo está um texto em formato de tabela que reflete
pessoalmente minhas avaliações (com elementos difusos) dos módulos de mapas
internos mais famosos (na época, eu não sabia sobre
www.openstreetmap.org , obrigado,
daglob ).

“Como a tarefa é simples, eu uso o Yandex.Maps. Eles são lindos, ágeis ... "- pensei.
Se alguém estiver interessado em como configurar isso, escreva um
miniprojeto , mas se você for muito preguiçoso -
tech.yandex.ru/maps/mapkit/?from=mapsapi ,
siga o caminho do meu caminho. Começar é fácil.
O fato é que a documentação é apresentada neste formulário:

Preste atenção na escassa descrição e na enorme lista de objetos à esquerda. Condene sua perna.
"Provavelmente o projeto de teste responderá às minhas perguntas." Bem, bem.
Aqui está essa fera.
github.com/yandex/mapkit-ios-demoNão vi soluções para minha tarefa trivial lá.
- Tudo bem - acho - tenho experiência suficiente, se não sou desenvolvedor.

Eu montei um projeto de teste e observei o recurso de personalizar o marcador do usuário por um longo tempo.
Pontos-chave:
Existe um objeto:
@IBOutlet weak var mapView: YMKMapView!
"Tudo parece ser lógico", você diz. Mas não. Métodos alternativos:
func onObjectAdded(with view: YMKUserLocationView) {} func onObjectRemoved(with view: YMKUserLocationView) {} func onObjectUpdated(with view: YMKUserLocationView, event: YMKObjectEvent) {}
temos a oportunidade de chegar ao point.lat e point.long de maneiras extremamente difíceis.
Por exemplo, assim:
userLocation = YMKPoint(latitude: view.pin.geometry.latitude, longitude: view.pin.geometry.longitude)
O tempo de espera para carregar coordenadas varia com essa abordagem de 2 a 50 segundos.
"Você está errado, deve haver um LocationManager focado", eu disse a mim mesma. Como se viu depois - de fato, esse "amigo" está na documentação ... MAS ONDE HÁ UM EXEMPLO COM ELE?!?
No projeto de amostra, não há exemplo da aplicação desse gerente:

- Bem, documentação, apenas você e eu resta.
- Sim, não há problemas, "inovador", aproveite:

Assinamos o UIViewController no protocolo (espero que não haja necessidade de explicar mais nada aqui, bem, sério, pessoal):
E ...

1-15 segundos, CARL! 15! Às vezes funciona mais rápido com a opção anterior! Como assim ??
Yandex, que piada? Tanto tempo para tentar tudo e obter esse resultado - bem, geralmente é triste.
Eu pensei, pensei ... Bem, na verdade não é o mesmo. Dê a uma pessoa um controlador com cartões e deixe-a estupor ao mudar para ele por mais de 4 segundos - isso é suicídio para o aplicativo. Ninguém esperará mais de 5 segundos com total confiança de que isso é confortável (se você não acredita em mim, ouça os relatórios de Vitaliy Fridman sobre UI / UX).
Pensei mais ... e a seguinte emoção foi essa:
Quem quer com som - www.youtube.com/watch?v=pTZaNHZGsQoA receita para o sucesso foi esta:
Pegue um
quilo ... CLLocationManager e YMKLocationManager e ... faça com que eles trabalhem juntos.

Essa junção ... "trabalho" se parece com isso:
... e o pilaf está prontoO resultado da velocidade de obter o ponto do usuário: um pouco mais de 0 segundos.
O próprio caso em que (na minha opinião) ao resolver um problema trivial, a oposição das partes nativas e incorporadas era assim:

O resultado do trabalho visualmente é o seguinte:

Resumindo o acima:
colegas, o artigo foi escrito para que, ao resolver um problema desse tipo, você não gaste tanto tempo quanto eu, e escolha um caminho diferente ou siga-o rapidamente.
Eu gostaria de ver críticas construtivas e / ou soluções
corretas alternativas.
Se o artigo se mostrou útil para você, corrija-me com uma classificação de Lois e, de preferência, verifique a
versão original desta história de uma nova maneira.
Todo o sucesso criativo e bom humor!