iOS: Swift - Как добавить точку на карту на ощупь и получить подробный адрес этого места?

Я хочу добавить аннотацию на сенсорную карту iOS и получить подробный адрес (метка) соответствующего местоположения. Как я могу добиться этого в Swift?

Заранее спасибо.

12 голосов | спросил SRK 23 WedEurope/Moscow2015-12-23T11:26:18+03:00Europe/Moscow12bEurope/MoscowWed, 23 Dec 2015 11:26:18 +0300 2015, 11:26:18

5 ответов


0

Чтобы отреагировать на прикосновение к карте, вам нужно настроить распознаватель касаний для mapView

в viewDidLoad:

let gestureRecognizer = UITapGestureRecognizer(target: self, action:"handleTap:")
    gestureRecognizer.delegate = self
    mapView.addGestureRecognizer(gestureRecognizer)

Отрегулируйте кран и получите координаты местоположения, от которого постучали:

func handleTap(gestureReconizer: UILongPressGestureRecognizer) {

    let location = gestureReconizer.locationInView(mapView)
    let coordinate = mapView.convertPoint(location,toCoordinateFromView: mapView)

    // Add annotation:
    let annotation = MKPointAnnotation()
    annotation.coordinate = coordinate
    mapView.addAnnotation(annotation)
}

Теперь вам нужно только реализовать делегатские функции MKMapView для рисования аннотаций. Простой поиск в Google должен помочь вам в этом.

ответил Moriya 23 WedEurope/Moscow2015-12-23T11:45:33+03:00Europe/Moscow12bEurope/MoscowWed, 23 Dec 2015 11:45:33 +0300 2015, 11:45:33
0

Swift 4:

 @IBOutlet weak var mapView: MKMapView!

 func handleLongPress (gestureRecognizer: UILongPressGestureRecognizer) {
    if gestureRecognizer.state == UIGestureRecognizerState.began {
        let touchPoint: CGPoint = gestureRecognizer.location(in: mapView)
        let newCoordinate: CLLocationCoordinate2D = mapView.convert(touchPoint, toCoordinateFrom: mapView)
        addAnnotationOnLocation(pointedCoordinate: newCoordinate)
    }
}

func addAnnotationOnLocation(pointedCoordinate: CLLocationCoordinate2D {
    let annotation = MKPointAnnotation()
    annotation.coordinate = pointedCoordinate
    annotation.title = "Loading..."
    annotation.subtitle = "Loading..."
    mapView.addAnnotation(annotation)
}
ответил Sat 18 Jam1000000amThu, 18 Jan 2018 11:59:48 +030018 2018, 11:59:48
0

Вот рабочий проект Xcode 10.1, Swift 4.2 с делегатами MapKit для управления аннотациями (цвет пин-кода, изображение пин-кода и т. д.) и делегатом для обработки клика по добавленная аннотация: Проект Github

import UIKit
import MapKit

class ViewController: UIViewController {

@IBOutlet weak var mapView: MKMapView!

override func viewDidLoad() {
    super.viewDidLoad()
    mapView.delegate = self
    let longTapGesture = UILongPressGestureRecognizer(target: self, action: #selector(longTap))
    mapView.addGestureRecognizer(longTapGesture)
}

@objc func longTap(sender: UIGestureRecognizer){
    print("long tap")
    if sender.state == .began {
        let locationInView = sender.location(in: mapView)
        let locationOnMap = mapView.convert(locationInView, toCoordinateFrom: mapView)
        addAnnotation(location: locationOnMap)
    }
}

func addAnnotation(location: CLLocationCoordinate2D){
        let annotation = MKPointAnnotation()
        annotation.coordinate = location
        annotation.title = "Some Title"
        annotation.subtitle = "Some Subtitle"
        self.mapView.addAnnotation(annotation)
}
}

extension ViewController: MKMapViewDelegate{

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
    guard annotation is MKPointAnnotation else { print("no mkpointannotaions"); return nil }

    let reuseId = "pin"
    var pinView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseId) as? MKPinAnnotationView

    if pinView == nil {
        pinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
        pinView!.canShowCallout = true
        pinView!.rightCalloutAccessoryView = UIButton(type: .infoDark)
        pinView!.pinTintColor = UIColor.black
    }
    else {
        pinView!.annotation = annotation
    }
    return pinView
}

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
    print("tapped on pin ")
}

func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {
    if control == view.rightCalloutAccessoryView {
        if let doSomething = view.annotation?.title! {
           print("do something")
        }
    }
  }
}
ответил Peter Pohlmann 21 FriEurope/Moscow2018-12-21T15:42:57+03:00Europe/Moscow12bEurope/MoscowFri, 21 Dec 2018 15:42:57 +0300 2018, 15:42:57
0

Для Swift 3.0

let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
gestureRecognizer.delegate = self
mapView.addGestureRecognizer(gestureRecognizer)

func handleTap(_ gestureReconizer: UILongPressGestureRecognizer) {

    let location = gestureReconizer.locationInView(mapView)
    let coordinate = mapView.convertPoint(location,toCoordinateFromView: mapView)

    // Add annotation:
    let annotation = MKPointAnnotation()
    annotation.coordinate = coordinate
    mapView.addAnnotation(annotation)
}
ответил Andre Lara 12 TueEurope/Moscow2017-12-12T22:53:22+03:00Europe/Moscow12bEurope/MoscowTue, 12 Dec 2017 22:53:22 +0300 2017, 22:53:22
0

Для Swift 4 я преобразовал пример Swift 3, так как другой Swift 4 не работал для меня: (обратите внимание, что я использую «mapview» вместо «mapView», чтобы соответствовать другому коду

        let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
        gestureRecognizer.delegate = self
        mapview.addGestureRecognizer(gestureRecognizer)


@objc func handleTap(_ gestureReconizer: UILongPressGestureRecognizer)
    {

        let location = gestureReconizer.location(in: mapview)
        let coordinate = mapview.convert(location,toCoordinateFrom: mapview)

        // Add annotation:
        let annotation = MKPointAnnotation()
        annotation.coordinate = coordinate
        mapview.addAnnotation(annotation)
    }
ответил SundialSoft 20 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 20 Sep 2018 14:13:48 +0300 2018, 14:13:48

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132