Yandex.Maps: рдореИрдВ рдХрд╛рд░реНрдб рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рдкрд╛рд╕ рдЧрдпрд╛ - рдореБрдЭреЗ рддреБрд░рдВрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдорд┐рд▓ рдЧрдИ (рдареАрдХ рд╣реИ, рдЕрдм рдЧрдВрднреАрд░рддрд╛ рд╕реЗ)

рдлрд┐рд░ рд╕реЗ рдмрдзрд╛рдИ!

рд╕рдмрд╕реЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рд▓реЗрдЦ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпреИрдВрдбреЗрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдкреНрдпрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдВрддреГрдкреНрдд рд╣реИред рдХрд╡рд┐рддрд╛ред рдУрдбреЗред рдпрд╣рд╛рдБ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡рд╣ habr.com/en/post/479102 рд╣реИ

рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдмреАрдЪ рдХрд╡рд┐рддрд╛ рдХреЗ рдХреБрдЫ рдкреНрд░реЗрдореА рд╣реИрдВ, рдореИрдВрдиреЗ рдлрд┐рд░ рднреА рд╕реНрдерд┐рддрд┐ рдХреЛ "рд╣рд╛рдмреЛрд░реЛрд╡реНрд╕реНрдХреА" рддрд░реАрдХреЗ рд╕реЗ рд░реЛрд╢рди рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдХреЛрдб, рд╡рд┐рдЪрд╛рд░ рдФрд░ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдкрдХрдбрд╝реЛред рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВред

рдЫрд╡рд┐

рдЪрд▓реЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рдХрд╛рд░реНрдп рддреБрдЪреНрдЫ рд╣реИ: рдЬрдм рдЖрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдмрд┐рдВрджреБ рдкрд░ рддреБрд░рдВрдд "рдмрд╛рд╣рд░ рдирд┐рдЪреЛрдбрд╝рдиреЗ" рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдб рдХреЗ рд╕рд╛рде рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╣реИрдВ (рдмреЛрдирд╕: рдЖрдкрдХреЛ рд╕рднреА рдЙрдкрд▓рдмреНрдз atibutes рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рд░реВрдк рдореЗрдВ рдкрддрд╛ рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛)ред

рд╣рдордиреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЛ рдХрд╛рдЯ рджрд┐рдпрд╛: "рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВ рдФрд░ рдЬреАрддреЗрдВред"

рдЗрд╕ рд▓рдХреНрд╖реНрдп рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдИ рддрдХрдиреАрдХреА рдФрд░ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЕрд░реНрдерд╛рддреН:

0. рдЬрд┐рдпреЛ-рдкреЛрдЬрд┐рд╢рдирд┐рдВрдЧ (MRSG), рдХреЙрд▓рдмреИрдХ рдЖрджрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рд┐рдд рдореЙрдбреНрдпреВрд▓ рд╡рд╛рд▓реЗ рдХрдВрдЯреНрд░реЛрд▓рд░ рдкрд░ рдЬрд╛рдПрдВред

1. IWG
1.1 IWG рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ
1.2 IWG рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ
1.2.1 рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
рез.реи.реи рдЙрд╕рдХреЛ рджреЗрдЦреЛ
2 *ред рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдХрд╛ рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред

рдирд┐рдпрдВрддреНрд░рдХ (VIPER + рд╡рд┐рдиреНрдпрд╛рд╕рдХ) рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛

extension AddPresenter: AddPresentationLogic { // ... func openMap(_ delegate: YandexMapSetPointViewControllerProtocol?) { router.routeTo(target: .addPlace(delegate)) } // ... } 

рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЬрдм рдЖрдк рд╡рд╛рдВрдЫрд┐рдд рдмрд┐рдВрджреБ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрд╕ рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рд▓реМрдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХрд╛рд░реНрдб рдХреЗ рд╕рд╛рде рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ:

 protocol YandexMapSetPointViewControllerProtocol { func didSelectPoint(_ place: Place) } 

рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ, рд╣рдо рдХреЙрд▓рд┐рдВрдЧ рдХреЛрдб рдХрд╛ рдирд┐рдпрдВрддреНрд░рдг рднрд╛рдЧ рднреЗрдЬрддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред

рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣рдо рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рдкрд╛рд╕ рдЬрд╛рддреЗ рд╣реИрдВ ...

рдЫрд╡рд┐

рдХреЗрдВрджреНрд░ рдореЗрдВ рдХреНрд░реЙрд╕рд╣реЗрдпрд░ рдмрд┐рд▓реНрдХреБрд▓ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рдФрд░ UIView рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред рдирдХреНрд╢реЗ рдХреЗ рдЕрдВрджрд░ рдЬрд╝реВрдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рдзрд╛рд░рдгрд╛ рдЦрд┐рдбрд╝рдХреА рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧреАред рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдирд┐рдХрд▓рд╛ред

рдмрд╛рдИрдВ рдУрд░ рдФрд░ рдХреНрд░реЙрд╕рд╣реЗрдпрд░ рдХреЗ рдареАрдХ рдиреАрдЪреЗ - рдЙрдЗрд▓рд╛рдмреЗрд▓ред рд╡рд╣рд╛рдВ рдПрдХ рдкрдардиреАрдп рдкрддрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИред UIActivityIndicator рдХреЗ рд╕рд╛рде рд░рд╛рдЗрдЯ рдмрдЯрдиред рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рддрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдирд╣реАрдВ рдЖрдП рд╣реИрдВ, рддрдм рддрдХ рд╡рд╣ "рдШреВрдорддрд╛ рд╣реИ" рдФрд░ рдмрдЯрди рдХреЛ рдЧрд╣рд░рд╛ рдФрд░ рдЕрдХреНрд╖рдо рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкреНрд░рд╛рдкреНрдд рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд╕рд╛рде рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ, рд╣рдо рдЙрд╕реЗ рдХреНрд░реЙрд╕рд╣реЗрдпрд░ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рдпрд╣ рд╕реНрдерд┐рддрд┐ рдХрд╛ рдПрдХ рд╕рдВрдХреЗрдд рд╣реИ, рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдиреАрдЪреЗ "Select Point" рдмрдЯрди рд╣реИред рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ, рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХрд╛ рдЬрд╛рджреВ рд╣реЛрддрд╛ рд╣реИ:

 @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) } 

рд╣реБрд░реНрд░реЗ! рд╣рдордиреЗ рддреИрдпрд╛рд░реА рдХреЗ рдЪрд░рдг рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА!

рд╣рдо MRSG рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред

рдиреАрдЪреЗ рдПрдХ рддрд╛рд▓рд┐рдХрд╛-рд╕реНрд╡рд░реВрдкрд┐рдд рдкрд╛рда рд╣реИ рдЬреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╕рдмрд╕реЗ рдкреНрд░рд╕рд┐рджреНрдз (рдЙрд╕ рд╕рдордп рдореБрдЭреЗ www.openstreetmap.org , рдзрдиреНрдпрд╡рд╛рдж, рдбреИрдЧрд▓реЛ ) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реЗ рдЖрдХрд▓рди (рдлрдЬреА рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде) рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдмрд┐рд▓реНрдЯ-рдЗрди рдореИрдк рдореЙрдбреНрдпреВрд▓ред



"рдЪреВрдВрдХрд┐ рдХрд╛рд░реНрдп рд╕рд░рд▓ рд╣реИ, рдореИрдВ Yandex.Maps рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рд╡реЗ рд╕реБрдВрджрд░, рдлреБрд░реНрддреАрд▓реЗ рд╣реИрдВ ... тАЭ- рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ред

рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдорд┐рдиреА-рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд▓рд┐рдЦреЗрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдмрд╣реБрдд рдЖрд▓рд╕реА рд╣реИрдВ - tech.yandex.ru/maps/mapkit/?from=mapsapi , рдореЗрд░реЗ рдкрде рдХреЗ рдЯреНрд░реИрдХ рдкрд░ рдкрд╣реБрдБрдЪреЗрдВ ред рд╢реБрд░реБрдЖрдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред

рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рд▓реЗрдЦрди рдЗрд╕ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:



рдмрд╛рдИрдВ рдУрд░ рдХреЗ рдореЗрдЬрд╝рд░ рд╡рд┐рд╡рд░рдг рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╡рд┐рд╢рд╛рд▓ рд╕реВрдЪреА рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рдзрд┐рдХреНрдХрд╛рд░ рд╣реИ рддреБрдореНрд╣рд╛рд░рд╛ рдкреИрд░ред
"рд╢рд╛рдпрдж рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрд░реЗ рд╕рд╡рд╛рд▓реЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдЧреАред" рдЕрдЪреНрдЫрд╛, рдЕрдЪреНрдЫрд╛ред

рдпрд╣рд╛рдБ рдпрд╣ рдЬрд╛рдирд╡рд░ рд╣реИред github.com/yandex/mapkit-ios-demo
рдореИрдВрдиреЗ рд╡рд╣рд╛рдВ рдЕрдкрдиреЗ рддреБрдЪреНрдЫ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рджреЗрдЦрд╛ред
- рдареАрдХ рд╣реИ, - рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ - рдореЗрд░реЗ рдкрд╛рд╕ рдкрд░реНрдпрд╛рдкреНрдд рдЕрдиреБрднрд╡ рд╣реИ, рдЕрдЧрд░ рдореИрдВ рдбреЗрд╡рд▓рдкрд░ рдирд╣реАрдВ рд╣реВрдВред



рдореИрдВрдиреЗ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдФрд░ рдПрдХ рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдорд╛рд░реНрдХрд░ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рджреЗрдЦрд╛ред

рдореБрдЦреНрдп рдмрд┐рдВрджреБ:
рдПрдХ рд╡рд╕реНрддреБ рд╣реИ:

 @IBOutlet weak var mapView: YMKMapView! //  YMKUserLocationObjectListener - ,   

"рд╕рдм рдХреБрдЫ рддрд░реНрдХрд╕рдВрдЧрдд рд▓рдЧрддрд╛ рд╣реИ," рдЖрдк рдХрд╣рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдирд╣реАрдВред рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реАрдХреЗ:

  func onObjectAdded(with view: YMKUserLocationView) {} func onObjectRemoved(with view: YMKUserLocationView) {} func onObjectUpdated(with view: YMKUserLocationView, event: YMKObjectEvent) {} 

рд╣рдореЗрдВ рдЕрддреНрдпрдВрдд рдХрдард┐рди рддрд░реАрдХреЛрдВ рд╕реЗ point.lat рдФрд░ point.long рдкрд░ рдЬрд╛рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдорд┐рд▓рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:

 userLocation = YMKPoint(latitude: view.pin.geometry.latitude, longitude: view.pin.geometry.longitude) 

рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕рдордп рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде 2 рд╕реЗ 50 рд╕реЗрдХрдВрдб рддрдХ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИред

"рдЖрдк рдЧрд▓рдд рд╣реИрдВ, рдПрдХ рдХреЗрдВрджреНрд░рд┐рдд рд╕реНрдерд╛рди рдкреНрд░рдмрдВрдзрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП," рдореИрдВрдиреЗ рдЦреБрдж рд╕реЗ рдХрд╣рд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдмрд╛рдж рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛ - рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ "рджреЛрд╕реНрдд" рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд╣реИ ... рд▓реЗрдХрд┐рди рд╡рд╣ рдХрд╣рд╛рдБ рд╣реИ?
рдирдореВрдирд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдРрд╕реЗ рдкреНрд░рдмрдВрдзрдХ рдХреЗ рдЖрд╡реЗрджрди рдХрд╛ рдХреЛрдИ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реИ:



- рдЦреИрд░, рдкреНрд░рд▓реЗрдЦрди, рдХреЗрд╡рд▓ рдЖрдк рдФрд░ рдореИрдВ рд╣реА рдмрдЪреЗ рд╣реИрдВред
- рд╣рд╛рдБ, рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, "рдЗрдиреЛрд╡реЗрдЯрд░", рдЖрдирдВрдж рд▓реЗрдВ:



рд╣рдо рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓рд┐рдП UIViewController рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВ (рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдЧреЗ рдХреБрдЫ рднреА рд╕рдордЭрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдареАрдХ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рджреЛрд╕реНрддреЛрдВ):

 // MARK: - // Params var userLocation: YMKPoint? { didSet { guard userLocation != nil && userLocation?.latitude != 0 && userLocation?.longitude != 0 else { return } if isItFirstSelection { isItFirstSelection = false selectedPoint = userLocation mapView.mapWindow.map.move( with: YMKCameraPosition.init(target: userLocation!, zoom: 16, azimuth: 0, tilt: 0), animationType: YMKAnimation(type: YMKAnimationType.smooth, duration: 1), cameraCallback: nil) } activityIndicator.stopAnimating() } } // MARK: - // Some like didLoad setupLocationManager() // MARK: - // Setup private func setupLocationManager() { locationManager = YMKMapKit.sharedInstance()!.createLocationManager() locationManager.subscribeForLocationUpdates(withDesiredAccuracy: 0, minTime: 10, minDistance: 0, allowUseInBackground: true, filteringMode: .on, locationListener: self) } // MARK: - // MARK: YMKLocationDelegate extension YandexMapSetPointViewController: YMKLocationDelegate { func onLocationUpdated(with location: YMKLocation) { userLocation = YMKPoint(latitude: location.position.latitude, longitude: location.position.longitude) } func onLocationStatusUpdated(with status: YMKLocationStatus) {} } 

рдФрд░ ...



1-15 рд╕реЗрдХрдВрдб, CARL! 15! рдХрднреА-рдХрднреА рдпрд╣ рдкрд┐рдЫрд▓реЗ рд╡рд┐рдХрд▓реНрдк рдХреЛ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! рдРрд╕рд╛ рдХреИрд╕реЗ ??
рдпрд╛рдВрдбреЗрдХреНрд╕, рдХреНрдпрд╛ рдордЬрд╝рд╛рдХ рд╣реИ? рдЗрддрдирд╛ рд╕рдордп рдпрд╣ рд╕рдм рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - рдареАрдХ рд╣реИ, рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рджреБрдЦ рдХреА рдмрд╛рдд рд╣реИред

рдореИрдВрдиреЗ рд╕реЛрдЪрд╛, рд╕реЛрдЪрд╛ ... рдЦреИрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рд╣реА рдирд╣реАрдВ рд╣реИред рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдХрд╛рд░реНрдб рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рдпрдВрддреНрд░рдХ рджреЗрдВ рдФрд░ рдЙрд╕реЗ 4 рд╕реЗрдХрдВрдб рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рддрдХ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдкрд░ рдЙрд╕реЗ рдПрдХ рд╕реНрддреВрдк рдореЗрдВ рдбрд╛рд▓ рджреЗрдВ - рдпрд╣ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдЖрддреНрдорд╣рддреНрдпрд╛ рд╣реИред рдХреЛрдИ рднреА рдкреВрд░реЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреЗ рд╕рд╛рде 5 рд╕реЗрдХрдВрдб рд╕реЗ рдЕрдзрд┐рдХ рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХрд┐ рдпрд╣ рдЖрд░рд╛рдорджрд╛рдпрдХ рд╣реИ (рдпрджрд┐ рдЖрдк рдореБрдЭ рдкрд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпреВрдЖрдИ / рдпреВрдПрдХреНрд╕ рдкрд░ рд╡рд┐рдЯрд╛рд▓реА рдлреНрд░рд┐рдбрдореИрди рдХреА рд░рд┐рдкреЛрд░реНрдЯ рд╕реБрдиреЗрдВ)ред

рдореИрдВрдиреЗ рдФрд░ рд╕реЛрдЪрд╛ ... рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рднрд╛рд╡рдирд╛ рдпрд╣ рдереА:


рдзреНрд╡рдирд┐ рдХреЗ рд╕рд╛рде рдХреМрди рдЪрд╛рд╣рддрд╛ рд╣реИ - www.youtube.com/watch?v=pTZaNHZGsQo

рд╕рдлрд▓рддрд╛ рдХрд╛ рдиреБрд╕реНрдЦрд╛ рдпрд╣ рдерд╛:
рдПрдХ рдХрд┐рд▓реЛ рд▓реЗрдВ ... CLLocationManager рдФрд░ YMKLocationManager рдФрд░ ... рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВред



рдпрд╣ рд╕рдВрдпреБрдХреНрдд ... "рдХрд╛рдо" рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 // Params private var locationManager: YMKLocationManager! private var nativeLocationManager = CLLocationManager() // MARK: - // Some like didLoad setupNativeLocationManager() // MARK: - // Setup private func setupNativeLocationManager() { if CLLocationManager.locationServicesEnabled() { nativeLocationManager.delegate = self nativeLocationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters nativeLocationManager.startUpdatingLocation() } } // MARK: - // CLLocationManagerDelegate extension YandexMapSetPointViewController: CLLocationManagerDelegate { func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { userLocation = YMKPoint(latitude: locations.last!.coordinate.latitude, longitude: locations.last!.coordinate.longitude) } } 


... рдФрд░ рдкрд┐рд▓рд╛рдл рддреИрдпрд╛рд░ рд╣реИ

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдмрд╛рдд рдкрд╛рдиреЗ рдХреА рдЧрддрд┐ рдХрд╛ рдкрд░рд┐рдгрд╛рдо: 0 рд╕реЗрдХрдВрдб рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХред

рдмрд╣реБрдд рдорд╛рдорд▓рд╛ рд╣реИ рдЬрдм (рдореЗрд░реА рд░рд╛рдп рдореЗрдВ) рдПрдХ рддреБрдЪреНрдЫ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╕рдордп, рджреЗрд╢реА рдФрд░ рдПрдореНрдмреЗрдбреЗрдб рднрд╛рдЧреЛрдВ рдХрд╛ рд╡рд┐рд░реЛрдз рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рдерд╛:



рдЬрд┐рдпреЛрдХреЛрдбрд░ *
рдПрдХ рдмреЛрдирд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдЬрд┐рдпреЛрдХреЛрдбрд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ред
рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ Yandex Geocoder tech.yandex.ru/maps/geocoder

 // Params private let geocoderManager = GeocoderManager.shared //      .     import Foundation import Alamofire import Alamofire_SwiftyJSON import SwiftyJSON import PromiseKit import UIKit // MARK: - // MARK: GeocoderManager class GeocoderManager { static let shared = GeocoderManager() private init() {} func getAddressBy(latitude: String, longitude: String, completion: @escaping (Bool, String?, Error?)->()) { GeocoderAPI().request(latitude: latitude, longitude: longitude).done { (response) in completion(true, response.getAddress(), nil) print("success") }.catch { (error) in completion(false, nil, error) } } } // import Foundation import Alamofire import PromiseKit // MARK: - // MARK: Request enum GeocoderRequest { case addressRequest(String, String) } // MARK: - // MARK: GeocoderRequest extension GeocoderRequest: DefaultRequest { var path: String { switch self { case .addressRequest: return "1.x/" } } var method: HTTPMethod { switch self { case .addressRequest: return .get } } var headers: HTTPHeaders { return [:] } var parameters: [String: Any]? { switch self { case .addressRequest(let latitude, let longitude): return [ "apikey" : Consts.APIKeys.yandexGeocoderKey, "format" : "json", "results" : 1, "spn" : "3.552069,2.400552", "geocode" : "\(longitude),\(latitude)" ] } } func asURLRequest() throws -> URLRequest { let url = try GlobalConsts.Links.geocoderBaseURL.asURL()// not good, need new idea for this var urlRequest = URLRequest(url: url.appendingPathComponent(path)) urlRequest.httpMethod = method.rawValue urlRequest.allHTTPHeaderFields = headers switch method { case .get: urlRequest = try URLEncoding.default.encode(urlRequest, with: parameters) case .post: urlRequest = try JSONEncoding.default.encode(urlRequest, with: parameters) case .put: urlRequest = try JSONEncoding.default.encode(urlRequest, with: parameters) case .patch: urlRequest = try JSONEncoding.default.encode(urlRequest, with: parameters) case .delete: urlRequest = try JSONEncoding.default.encode(urlRequest, with: parameters) default: break } return urlRequest } } 

рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдореЙрдбрд▓ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдВрд╕рд╛рдзрди рдмрд╣реБрдд рдорджрдж рдХрд░рддрд╛ рд╣реИ: app.quicktype.io

рджреГрд╖реНрдЯрд┐рдЧрдд рдХрд╛рд░реНрдп рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:



рдЙрдкрд░реЛрдХреНрдд рд╕рд╛рд░рд╛рдВрд╢:
рд╕рд╣рдХрд░реНрдорд┐рдпреЛрдВ, рд▓реЗрдЦ рдЗрд╕рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╕рдордп рдЖрдк рдЙрддрдирд╛ рд╕рдордп рди рдмрд┐рддрд╛рдПрдВ рдЬрд┐рддрдирд╛ рдореИрдВрдиреЗ рдмрд┐рддрд╛рдпрд╛ рдерд╛ рдФрд░ рдпрд╛ рддреЛ рдПрдХ рдЕрд▓рдЧ рд░рд╛рд╕реНрддрд╛ рдЪреБрдиреЗрдВ рдпрд╛ рдЬрд▓реНрджреА рд╕реЗ рдЪрд▓реЗрдВред

рдореИрдВ рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рдФрд░ / рдпрд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рд╣реА рд╕рдорд╛рдзрд╛рди рджреЗрдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред

рдпрджрд┐ рд▓реЗрдЦ рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ, рддреЛ рдореБрдЭреЗ рдПрдХ рд▓реЛрдЗрд╕ рд░реЗрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕рд╣реА рдХрд░реЗрдВ рдФрд░, рдЕрдзрд┐рдорд╛рдирддрдГ, рдЗрд╕ рдХрд╣рд╛рдиреА рдХреЗ рдореВрд▓ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдПрдХ рдирдП рддрд░реАрдХреЗ рд╕реЗ рджреЗрдЦреЗрдВред

рд╕рднреА рд░рдЪрдирд╛рддреНрдордХ рд╕рдлрд▓рддрд╛ рдФрд░ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдордиреЛрджрд╢рд╛!

Source: https://habr.com/ru/post/hi479432/


All Articles