Mapkit получает текущие координаты метки

Я новичок в MapKit и пытаюсь показать информацию и направления после выбора маркера места. Я показываю местные больницы и службы экстренной помощи. Как получить информацию о выбранной в данный момент метке. Я хочу иметь возможность показать несколько строк информации о выбранном маркере. Например, имя, адрес, номер телефона и, возможно, кнопка для направления. Я хочу сохранить текущие выбранные координаты маркеров в переменную.

изображение карты

class MapKitViewController: UIViewController, MKMapViewDelegate {


let locationManager = CLLocationManager()
let regionInMeters: Double = 10000
var previousLocation: CLLocation?

let geoCoder = CLGeocoder()
var directionsArray: [MKDirections] = []



func setupLocationManager() {
    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
}

func centerViewOnUserLocation() {
    if let location = locationManager.location?.coordinate {
        let region = MKCoordinateRegion.init(center: location, latitudinalMeters: regionInMeters, longitudinalMeters: regionInMeters)
        mapView.setRegion(region, animated: true)
    }
}


func checkLocationServices() {
    if CLLocationManager.locationServicesEnabled() {
        setupLocationManager()
        performSearch()
        checkLocationAuthorization()
    } else {
        // Show alert letting the user know they have to turn this on.
    }
}

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation)
    -> MKAnnotationView? {

        let identifier = "marker"
        var view: MKMarkerAnnotationView

        if let dequeuedView = mapView.dequeueReusableAnnotationView(
            withIdentifier: identifier)
            as? MKMarkerAnnotationView {
            dequeuedView.annotation = annotation
            view = dequeuedView
        } else {
            view =
                MKMarkerAnnotationView(annotation: annotation,
                                       reuseIdentifier: identifier)


            view.markerTintColor = UIColor.blue
            view.canShowCallout = true
            view.calloutOffset = CGPoint(x: -5, y: 5)
            view.rightCalloutAccessoryView = UIButton(type: .detailDisclosure)

        }
        return view
}

func mapView(_: MKMapView, annotationView:
    MKAnnotationView, calloutAccessoryControlTapped: UIControl) {


    print("Control tapped")
}

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {


}

Что это за вещь, которую вы называете «меткой места»? Это маркер аннотации или метка?

El Tomato 21.03.2019 04:08

я имею в виду красные булавки на изображении, результаты отображаются на карте.

ppApp 21.03.2019 04:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
641
1

Ответы 1

Исходный класс аннотаций (MKPointAnnotation) не позволяет дать пину много информации, кроме заголовка и подзаголовка. Поэтому вам нужно сделать подкласс из MKPointAnnotation, чтобы вы могли однозначно идентифицировать контакт, который нажимает пользователь, который будет обнаружен методом делегата MKMapViewdidSelect.

Сначала создайте быстрый файл с именем MyPointAnnotation следующим образом.

import MapKit

class MyPointAnnotation: MKPointAnnotation {
    var identifier: String?
    //var image: UIImage?
    var lat: Double!
    var lon: Double!
}

Затем используйте подкласс выше, чтобы сделать аннотации и добавить их на карту.

import UIKit
import MapKit

class MapViewController: UIViewController, MKMapViewDelegate {
    // MARK: - Variables

    // MARK: - IBOutlet
    @IBOutlet weak var mapView: MKMapView!

    override func viewDidLoad() {
        super.viewDidLoad()
        mapView.delegate = self
    }

    @IBAction func addNewPin(_ sender: UIBarButtonItem) {
        addNewAnnotationPin(title: "Restaurant", subTitle: "Barbecue", lat: 35.6387264874361, lon: 139.99950350000003)
    }

    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
        guard !(annotation is MKUserLocation) else {
            return nil
        }

        let reuseId = "pin"
        var pinView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseId) as? MKPinAnnotationView
        if pinView == nil {
            pinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
            pinView?.pinTintColor = UIColor.red
            pinView?.canShowCallout = true
        }
        else {
            pinView?.annotation = annotation
        }
        return pinView
    }

    func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
        if view.annotation is MyPointAnnotation {
            if let selectedAnnotation = view.annotation as? MyPointAnnotation {
                if let id = selectedAnnotation.identifier {
                    for pin in mapView.annotations as! [MyPointAnnotation] {
                        if let myIdentifier = pin.identifier {
                            if myIdentifier == id {
                                print(pin.lat ?? 0.0)
                                print(pin.lon ?? 0.0)
                            }
                        }
                    }
                }
            }
        }
    }

    func addNewAnnotationPin(title: String, subTitle: String, lat: Double, lon: Double) {
        let myPin = MyPointAnnotation()
        myPin.coordinate = CLLocationCoordinate2D(latitude: lat, longitude: lon)
        myPin.title = title
        myPin.subtitle = subTitle
        myPin.identifier = UUID().uuidString
        myPin.lat = lat
        myPin.lon = lon
        self.mapView.addAnnotation(myPin)
    }
}

откуда берется действие addNewPin?

ppApp 21.03.2019 16:54

Вы не должны использовать его. Вы можете добавить аннотационную булавку любым удобным для вас способом. Я создал его для своего удобства.

El Tomato 21.03.2019 18:55

Я пробовал это, но ничего не печатается в консоли при выборе

ppApp 23.03.2019 00:32

Я проверил это на себе. Если не получится, не вините меня.

El Tomato 23.03.2019 00:34

нет, я не виню вас, это очень полезно, я пытаюсь проверить это, спасибо за помощь

ppApp 23.03.2019 00:45

Другие вопросы по теме