InsideDarkWeb.com

YandexMapKit кластеры

Всем привет! Пытаюсь реализовать добавление фото на кластер, но никак не получается. Есть массив из объектов 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!

Related Questions

fetch данных в select react

1  Asked on January 20, 2021 by max-akinshin

     

Почему отстает state? React

2  Asked on January 19, 2021 by bazmexes

   

Вопрос по метаклассам

1  Asked on January 18, 2021 by user364464

   

GULP создание 2 файлов

2  Asked on January 18, 2021 by casket

 

Ask a Question

Get help from others!

© 2021 InsideDarkWeb.com. All rights reserved.