TransWikia.com

YandexMapKit кластеры

Stack Overflow на русском Asked by SooqaEffect on October 17, 2020

Всем привет! Пытаюсь реализовать добавление фото на кластер, но никак не получается. Есть массив из объектов Partner, который я получаю по сети, обращаясь к API. Выглядит примерно так:

struct Partner {
let name: String?
let logo: String?
let clusterImage: String?
let pinImage:String
let outlet: [Outlet]?
} 
struct Outlet {
let logitude: String?
let latitude: String?

В структуре Outlet может находиться много расположений. По сути, Partner – название магазина и нужные фотки. А Outlet – уже координаты магазинов.

Далее я использую цикл, чтобы все раскидать по кластерам.

    for partner in data.partners! {
        let collection = self.mapView.mapWindow.map.mapObjects.addClusterizedPlacemarkCollection(with: self)
        for outlet in partner.outlets! {
            guard let lattitude = outlet.latitude, let longitude = outlet.longitude else { return }
            self.interactor?.fetchIconPins(id: partner.pinIcon, completion: { (image) in
                collection.addPlacemark(with: YMKPoint(latitude: Double(lattitude)!, longitude: Double(longitude)!), image: image, style: YMKIconStyle())
                collection.clusterPlacemarks(withClusterRadius: 60, minZoom: 15)
            })
        }
    }

После этого, на карте отображается все по кластерам.
Но как для каждого кластера задать нужную фотографию?

One Answer

Надо подписаться под протокол YMKClusterListener и реализовать метод:

//YMKClusterListener
func onClusterAdded(with cluster: YMKCluster) {
    // We setup cluster appearance and tap handler in this method
    cluster.appearance.setIconWith(clusterImage(cluster.size))
}

Метод для отрисовки кластера, с его размером в виде числа внутри:

func clusterImage(_ clusterSize: UInt) -> UIImage {
        let fontSize: CGFloat = 15
        let marginSize: CGFloat = 3
        let strokeSize: CGFloat = 3
        
        let scale = UIScreen.main.scale
        let text = (clusterSize as NSNumber).stringValue
        let font = UIFont.regular(withSize: fontSize * scale)
        let size = text.size(withAttributes: [NSAttributedString.Key.font: font])
        let textRadius = sqrt(size.height * size.height + size.width * size.width) / 2
        let internalRadius = textRadius + marginSize * scale
        let externalRadius = internalRadius + strokeSize * scale
        let iconSize = CGSize(width: externalRadius * 2, height: externalRadius * 2)
        
        UIGraphicsBeginImageContext(iconSize)
        let ctx = UIGraphicsGetCurrentContext()!
        
        ctx.setFillColor(UIColor.main.cgColor)
        ctx.fillEllipse(in: CGRect(
                            origin: .zero,
                            size: CGSize(width: 2 * externalRadius, height: 2 * externalRadius)));
        
        ctx.setFillColor(UIColor.white.cgColor)
        ctx.fillEllipse(in: CGRect(
                            origin: CGPoint(x: externalRadius - internalRadius, y: externalRadius - internalRadius),
                            size: CGSize(width: 2 * internalRadius, height: 2 * internalRadius)));
        
        (text as NSString).draw(
            in: CGRect(
                origin: CGPoint(x: externalRadius - size.width / 2, y: externalRadius - size.height / 2),
                size: size),
            withAttributes: [
                NSAttributedString.Key.font: font,
                NSAttributedString.Key.foregroundColor: UIColor.black])
        let image = UIGraphicsGetImageFromCurrentImageContext()!
        return image
    }

Answered by D.Radmir on October 17, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP