Яндекс MapKit iOS: кластер и метки
Я использую Yandex Mapkit iOS SDK для одного из своих проектов.
Похоже, что SDK позволяет добавлять метки в кластер. Но я не могу добавить собственную метку места с помощью userData так же, как добавление метки в качествеmapObject
. Я хочу обнаружить нажатие на маркер.
// adding markers as mapobjects:
let point = YMKPoint(coordinate: CLLocationCoordinate2D(latitude: Double(hit.geom!.lat ?? 0), longitude: Double(hit.geom?.lon ?? 0)))
let placemark: YMKPlacemarkMapObject
self.mapObjects = self.mapView.mapWindow.map.mapObjects
placemark = mapObjects!.addPlacemark(with: point, image: #imageLiteral(resourceName: "marker"))
placemark.userData = MarkerUserData(id: Int(hit.id!)!, description: hit.plate!)
placemark.isDraggable = false
placemark.addTapListener(with: self)
mapObjects!.addListener(with: self)
Добавляя маркеры в кластер, маркеры могут быть добавлены в кластер, используя только YMKPoint
. Я не мог найти способ добавитьplacemark
объект внутри кластера
let point = YMKPoint(coordinate: CLLocationCoordinate2D(latitude: Double(hit.geom!.lat ?? 0), longitude: Double(hit.geom?.lon ?? 0)))
let placemark: YMKPlacemarkMapObject
collection.addPlacemark(with: point, image: #imageLiteral(resourceName: "marker"))
// Placemarks won't be displayed until this method is called. It must be also called
// to force clusters update after collection change
collection.clusterPlacemarks(withClusterRadius: 20, minZoom: 5)
1 ответ
Определите коллекцию с помощью слушателя. Заполните массив любыми точками. Пройдите по массиву и добавьте каждую точку в коллекцию. При добавлении точки в коллекцию возвращается YMKPlacemarkMapObject, добавляя данные пользователя. И расширите свой метод делегата контроллера.
И посмотрите тестовый проект с Яндексом - https://github.com/yandex/mapkit-ios-demo/blob/master/MapKitDemo/ClusteringViewController.swift
class MapViewController: UIViewController {
@IBOutlet weak var mapView: YMKMapView!
var collection: YMKClusterizedPlacemarkCollection?
var point: [YMKPoint] = [] // Fill the array with any points
override func viewDidLoad() {
super.viewDidLoad()
collection = mapView.mapWindow.map.mapObjects.addClusterizedPlacemarkCollection(with: self)
collection?.addTapListener(with: self)
for point in points {
let placemark = collection?.addPlacemark(with: point,
image: UIImage(named: "some_image")!,
style: YMKIconStyle.init())
placemark?.userData = "user data"
}
collection.clusterPlacemarks(withClusterRadius: 60, minZoom: 15)
}
}
extension MapViewController: YMKMapObjectTapListener {
func onMapObjectTap(with mapObject: YMKMapObject, point: YMKPoint) -> Bool {
guard let userPoint = mapObject as? YMKPlacemarkMapObject else {
return true
}
print(userPoint.userData)
}
}