#swift #mapkit #mapkitannotation
#swift #mapkit #mapkitannotation
Вопрос:
Я довольно новичок в 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) {
}
Комментарии:
1. Что это за вещь, которую вы называете «меткой размещения»? Это маркер аннотации или метка размещения?
2. я имею в виду красные значки на изображении, результаты, отображаемые на карте.
Ответ №1:
Исходный класс аннотаций ( MKPointAnnotation
) не позволяет вам предоставлять pin-коду много информации, кроме заголовка и подзаголовка. Итак, вам нужно создать подкласс из MKPointAnnotation
, чтобы вы могли однозначно идентифицировать pin-код, который нажимает пользователь, который будет обнаружен с помощью MKMapView
didSelect
метода делегирования.
Сначала создайте файл swift с именем 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)
}
}
Комментарии:
1. откуда берется действие addNewPin?
2. Вам не обязательно это использовать. Вы можете добавить pin-код аннотации любым удобным для вас способом. Я создал это для удобства.
3. Я пробовал это, но при выборе в консоли ничего не печатается
4. Я протестировал это сам. Если это не сработает, не вините меня.
5. нет, я не обвиняю вас, это очень полезно, я пытаюсь протестировать это подробнее, спасибо за помощь