Created
November 28, 2022 15:18
-
-
Save ashishkanani/604d75e745b352dec015030627f112dd to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// 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