From 45df1c10cbc305e2e3c412e89bdb6f2ab7f8a597 Mon Sep 17 00:00:00 2001 From: Riley Testut Date: Mon, 16 Oct 2023 19:02:41 -0500 Subject: [PATCH] Adds UIColor.adjustedForDisplay() to display illegible tint colors Adjusts illegible tint colors so that they can be displayed in the UI, e.g. by making them brighter or darker. --- AltStore/Extensions/UIColor+AltStore.swift | 48 ++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/AltStore/Extensions/UIColor+AltStore.swift b/AltStore/Extensions/UIColor+AltStore.swift index a88de14c..476fba15 100644 --- a/AltStore/Extensions/UIColor+AltStore.swift +++ b/AltStore/Extensions/UIColor+AltStore.swift @@ -12,3 +12,51 @@ extension UIColor { static let altBackground = UIColor(named: "Background")! } + +extension UIColor +{ + private static let brightnessMaxThreshold = 0.85 + private static let brightnessMinThreshold = 0.35 + + private static let saturationBrightnessThreshold = 0.5 + + var adjustedForDisplay: UIColor { + guard self.isTooBright || self.isTooDark else { return self } + + return UIColor { traits in + var hue: CGFloat = 0 + var saturation: CGFloat = 0 + var brightness: CGFloat = 0 + guard self.getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: nil) else { return self } + + brightness = min(brightness, UIColor.brightnessMaxThreshold) + + if traits.userInterfaceStyle == .dark + { + // Only raise brightness when in dark mode. + brightness = max(brightness, UIColor.brightnessMinThreshold) + } + + let color = UIColor(hue: hue, saturation: saturation, brightness: brightness, alpha: 1.0) + return color + } + } + + var isTooBright: Bool { + var saturation: CGFloat = 0 + var brightness: CGFloat = 0 + + guard self.getHue(nil, saturation: &saturation, brightness: &brightness, alpha: nil) else { return false } + + let isTooBright = (brightness >= UIColor.brightnessMaxThreshold && saturation <= UIColor.saturationBrightnessThreshold) + return isTooBright + } + + var isTooDark: Bool { + var brightness: CGFloat = 0 + guard self.getHue(nil, saturation: nil, brightness: &brightness, alpha: nil) else { return false } + + let isTooDark = brightness <= UIColor.brightnessMinThreshold + return isTooDark + } +}