В этой статье мы обсудим, как установить пин в определенном месте на MapKit с его правильной реализацией с помощью Swift. Если я что-то пропустил, дайте мне знать в комментариях.

Давайте начнем:

Мы продолжим нашу предыдущую статью, если вы пропустили ее, вы можете прочитать ее здесь. Как только мы получим местоположение пользователя, теперь мы установим булавку для местоположения пользователя. Для размещения булавки в MapKit у нас есть 3 способа

  1. Использование MKPlacemark.
  2. Использование MKPointAnnotation.
  3. Использование MKAnnotation.

1. Использование MKPlacemark :

MKPlacemark - самый простой способ разместить булавку на карте. Просто потребовались координаты места, куда ставить штифт. Используйте эту функцию для установки пина:

func setPinUsingMKPlacemark(location: CLLocationCoordinate2D) {
   let pin = MKPlacemark(coordinate: location)
   let coordinateRegion = MKCoordinateRegion(center: pin.coordinate, latitudinalMeters: 800, longitudinalMeters: 800)
   mapView.setRegion(coordinateRegion, animated: true)
   mapView.addAnnotation(pin)
}

2. Использование MKPointAnnotation:

MKPointAnnotation - это также самый простой способ разместить маркер на карте.

func setPinUsingMKPointAnnotation(location: CLLocationCoordinate2D){
   let annotation = MKPointAnnotation()
   annotation.coordinate = location
   annotation.title = "Here"
   annotation.subtitle = "Device Location"
   let coordinateRegion = MKCoordinateRegion(center: annotation.coordinate, latitudinalMeters: 800, longitudinalMeters: 800)
   mapView.setRegion(coordinateRegion, animated: true)
   mapView.addAnnotation(annotation)
}

3. Использование MKAnnotation:

Для MKAnnotation мы должны создать класс модели для булавки, который содержит данные о контактах, но не обеспечивает визуального представления булавки на карте.

import MapKit
class MapPin: NSObject, MKAnnotation {
   let title: String?
   let locationName: String
   let coordinate: CLLocationCoordinate2D
init(title: String, locationName: String, coordinate: CLLocationCoordinate2D) {
      self.title = title
      self.locationName = locationName
      self.coordinate = coordinate
   }
}

Используйте эту функцию для установки булавки на карте:

func setPinUsingMKAnnotation(location: CLLocationCoordinate2D) {
   let pin1 = MapPin(title: “Here”, locationName: “Device Location”, coordinate: location)
   let coordinateRegion = MKCoordinateRegion(center: pin1.coordinate, latitudinalMeters: 800, longitudinalMeters: 800)
   mapView.setRegion(coordinateRegion, animated: true)
   mapView.addAnnotations([pin1])
}

Из всех вышеперечисленных методов на карте будет отображаться значок по умолчанию, и вы также можете изменить заголовок и подзаголовок. Выше всех методов вы можете видеть, что есть метод setRegion, который используется для фокусировки на заданном месте. Теперь мы установим пользовательский пин на карте. Для этого мы должны внедрить делегат для просмотра карты, поэтому мы пишем это в нашем методе настройки.

mapView.delegate = self

Теперь напишем методы делегата:

//MARK: — MKMapView Delegate Methods
extension ViewController: MKMapViewDelegate {
   func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
   
      let Identifier = “Pin”
      let annotationView = annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: Identifier) ?? MKAnnotationView(annotation: annotation, reuseIdentifier: Identifier)
   
      annotationView.canShowCallout = true
      if annotation is MKUserLocation {
         return nil
      } else if annotation is MapPin {
         annotationView.image =  UIImage(imageLiteralResourceName: "Pin")
         return annotationView
      } else {
         return nil
      }
   }
}

Как и на изображении выше, вы можете увидеть всплывающее окно на булавке с заголовком его свойство callOut представления аннотации. Если вы мужчина, это ложь, тогда это не будет отображаться

annotationView.canShowCallout = true

Аннотация кластера:

Когда у нас есть много контактов в одном месте, он выглядит проверенным, поэтому Apple вводит MKClusterAnnotation, из которого отображается 1 контакт с количеством контактов в этом месте, что более легко обрабатывать для кластеризации, просто напишите следующие строки кода в вышеуказанных методах делегата.

if #available(iOS 11.0, *) {
   annotationView.clusteringIdentifier = “PinCluster”
} else {
   // Fallback on earlier versions
}