Skip to content

Instantly share code, notes, and snippets.

@ashishkanani
Created November 28, 2022 15:18
Show Gist options
  • Save ashishkanani/604d75e745b352dec015030627f112dd to your computer and use it in GitHub Desktop.
Save ashishkanani/604d75e745b352dec015030627f112dd to your computer and use it in GitHub Desktop.
//
// ClusterIconGenerator.swift
//
import Foundation
import GoogleMapsUtils
class ClusterIconGenerator: NSObject, GMUClusterIconGenerator {
private struct IconSize {
private let initialFontSize: CGFloat = 12
private let fontMultiplier: CGFloat = 0.1
private let initialSize: CGFloat = 25
private let sizeMultiplier: CGFloat = 0.18
/**
Rounded cluster sizes (like 10+, 20+, etc.)
*/
private let sizes = [10,20,50,100,200,500,1000]
let size: UInt
/**
Returns scale level based on size index in `sizes`. Returns `1` if size doesn't have rounded representation
*/
private var scaleLevel: UInt {
if let index = sizes.lastIndex(where: { $0 <= size }) {
return UInt(index) + 2
} else {
return 1
}
}
/**
Returns designed title from cluster's size
*/
var designedTitle: String {
if let size = sizes.last(where: { $0 <= size }) {
return "\(size)+"
} else {
return "\(size)"
}
}
/**
Returns initial font size multiplied by recursively created multiplier
*/
var designedFontSize: CGFloat {
let multiplier: CGFloat = (1...scaleLevel).reduce(1) { n,_ in n + n * fontMultiplier }
return initialFontSize * multiplier
}
/**
Returns initial `CGSize` multiplied by recursively created multiplier
*/
var designedSize: CGSize {
let multiplier: CGFloat = (1...scaleLevel).reduce(1) { n,_ in n + n * sizeMultiplier }
return CGSize(width: initialSize * multiplier, height: initialSize * multiplier)
}
}
/**
Returns image based on current cluster's size
*/
func icon(forSize size: UInt) -> UIImage! {
let iconSize = IconSize(size: size)
let frame = CGRect(origin: .zero, size: iconSize.designedSize)
let view = UIView(frame: frame)
view.layer.cornerRadius = iconSize.designedSize.height / 2
view.backgroundColor = isFootball ? COLOR.mainGreen : COLOR.mainOrange
let label = UILabel(frame: frame)
label.textAlignment = .center
label.textColor = .white
label.text = iconSize.designedTitle
view.addSubview(label)
return view.asImage
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment