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)
})
}
}
После этого, на карте отображается все по кластерам.
Но как для каждого кластера задать нужную фотографию?
Надо подписаться под протокол 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
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP