From d1c82778da72c58b0dbd4a6f627bfbce6cf620d0 Mon Sep 17 00:00:00 2001 From: Dominic Go <18517029+dominicstop@users.noreply.github.com> Date: Fri, 12 Nov 2021 06:28:54 +0800 Subject: [PATCH] =?UTF-8?q?=E2=98=AF=EF=B8=8F=20Updated=20`UIColor+Helpers?= =?UTF-8?q?.swift`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: Updated to use the implementation in `react-native-ios-navigator`. * Commit: `69498592ef6202335428c15eef1c3c8887bce48a` * Link: https://github.com/dominicstop/react-native-ios-navigator/commit/69498592ef6202335428c15eef1c3c8887bce48a --- ios/src/Extensions/UIColor+Helpers.swift | 157 ++++++++++++++++++++++- 1 file changed, 150 insertions(+), 7 deletions(-) diff --git a/ios/src/Extensions/UIColor+Helpers.swift b/ios/src/Extensions/UIColor+Helpers.swift index 88f1e17..9bce15c 100644 --- a/ios/src/Extensions/UIColor+Helpers.swift +++ b/ios/src/Extensions/UIColor+Helpers.swift @@ -198,14 +198,131 @@ fileprivate class UIColorHelpers { }; extension UIColor { - public convenience init?(cssColorCode: String) { + + var rgba: (r: CGFloat, g: CGFloat, b: CGFloat, a: CGFloat) { + var red : CGFloat = 0; + var green: CGFloat = 0; + var blue : CGFloat = 0; + var alpha: CGFloat = 0; + + getRed(&red, green: &green, blue: &blue, alpha: &alpha); + return (red, green, blue, alpha); + }; + + @available(iOS 13.0, *) + static func elementColorFromString(_ string: String) -> UIColor? { + switch string { + // Label Colors + case "label": return .label; + case "secondaryLabel": return .secondaryLabel; + case "tertiaryLabel": return .tertiaryLabel; + case "quaternaryLabel": return .quaternaryLabel; + + // Fill Colors + case "systemFill": return .systemFill; + case "secondarySystemFill": return .secondarySystemFill; + case "tertiarySystemFill": return .tertiarySystemFill; + case "quaternarySystemFill": return .quaternarySystemFill; + + // Text Colors + case "placeholderText": return .placeholderText; + + // Standard Content Background Colors + case "systemBackground": return .systemBackground; + case "secondarySystemBackground": return .secondarySystemBackground; + case "tertiarySystemBackground": return .tertiarySystemBackground; + + // Grouped Content Background Colors + case "systemGroupedBackground": return .systemGroupedBackground; + case "secondarySystemGroupedBackground": return .secondarySystemGroupedBackground; + case "tertiarySystemGroupedBackground": return .tertiarySystemGroupedBackground; + + // Separator Colors + case "separator": return .separator; + case "opaqueSeparator": return .opaqueSeparator; + + // Link Color + case "link": return .link; + + // Non-adaptable Colors + case "darkText": return .darkText; + case "lightText": return .lightText; + + default: return nil; + }; + }; + + static func systemColorFromString(_ string: String) -> UIColor? { + switch string { + // Adaptable Colors + case "systemBlue" : return .systemBlue; + case "systemGreen" : return .systemGreen; + case "systemOrange": return .systemOrange; + case "systemPink" : return .systemPink; + case "systemPurple": return .systemPurple; + case "systemRed" : return .systemRed; + case "systemTeal" : return .systemTeal; + case "systemYellow": return .systemYellow; + + default: break; + }; + + if #available(iOS 13.0, *) { + switch string { + case "systemIndigo" : return .systemIndigo; + + //Adaptable Gray Colors + case "systemGray" : return .systemGray; + case "systemGray2": return .systemGray2; + case "systemGray3": return .systemGray3; + case "systemGray4": return .systemGray4; + case "systemGray5": return .systemGray5; + case "systemGray6": return .systemGray6; + + default: break; + }; + }; + + return nil; + }; + + /// Parse "react native" color to `UIColor` + /// Swift impl. `RCTConvert` color + static func parseColor(value: Any) -> UIColor? { + if let string = value as? String { + if #available(iOS 13.0, *), + let color = Self.elementColorFromString(string) { + + // a: iOS 13+ ui enum colors + return color; + + } else if let color = Self.systemColorFromString(string) { + // b: iOS system enum colors + return color; + + } else { + // c: react-native color string + return UIColor(cssColor: string); + }; + + } else if let dict = value as? NSDictionary { + // d: react-native DynamicColor object + return UIColor(dynamicDict: dict); + }; + + return nil; + }; + + /// create color from css color code string + convenience init?(cssColorCode: String) { guard let color = UIColorHelpers.cssColorsToRGB[cssColorCode.lowercased()] else { return nil }; self.init(red: color.r, green: color.g, blue: color.b, alpha: 1); }; - public convenience init?(hexString: String) { + /// create color from hex color string + convenience init?(hexString: String) { guard hexString.hasPrefix("#") else { return nil }; let hexColor: String = UIColorHelpers.normalizeHexString(hexString); @@ -226,7 +343,8 @@ extension UIColor { ); }; - public convenience init?(rgbString: String){ + /// create color from rgb/rgba string + convenience init?(rgbString: String){ // create mutable copy... var rgbString = rgbString; @@ -278,8 +396,8 @@ extension UIColor { }; }; - // create color from rgb/rgba/hex/csscolor strings - public convenience init?(cssColor: String){ + /// create color from rgb/rgba/hex/csscolor strings + convenience init?(cssColor: String){ // remove whitespace characters let colorString = cssColor.trimmingCharacters(in: .whitespacesAndNewlines); @@ -298,6 +416,31 @@ extension UIColor { return nil; }; }; + + /// create color from `DynamicColorIOS` dictionary + convenience init?(dynamicDict: NSDictionary) { + guard let dict = dynamicDict["dynamic"] as? NSDictionary, + let stringDark = dict["dark" ] as? String, + let stringLight = dict["light"] as? String + else { return nil }; + + if #available(iOS 13.0, *), + let colorDark = UIColor(cssColor: stringDark ), + let colorLight = UIColor(cssColor: stringLight) { + + self.init(dynamicProvider: { traitCollection in + switch traitCollection.userInterfaceStyle { + case .dark : return colorDark; + case .light: return colorLight; + + case .unspecified: fallthrough; + @unknown default : return .clear; + }; + }); + + } else { + self.init(cssColor: stringLight); + }; + }; + }; - -