Яндекс MapKit iOS: кластер и метки - PullRequest
1 голос
/ 06 января 2020

Я использую Яндекс 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 Ответ

1 голос
/ 13 января 2020

Определите коллекцию со слушателем. Заполните массив любыми точками. Go через массив и добавить каждую точку в коллекцию. При добавлении точки в коллекцию возвращается 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)
    }
}
...