I am trying to use iOS 16's toolbarBackground
modifier. The example gives the following usage:
.toolbarBackground(
Color.blue,
for: .tabBar
)
That works as expected. I have a Color extension that I am using throughout my app that allows it take hex codes:
Color extension
extension Color {
init?(_ hex: String) {
var str = hex
if str.hasPrefix("#") {
str.removeFirst()
}
if str.count == 3 {
str = String(repeating: str[str.startIndex], count: 2)
String(repeating: str[str.index(str.startIndex, offsetBy: 1)], count: 2)
String(repeating: str[str.index(str.startIndex, offsetBy: 2)], count: 2)
} else if !str.count.isMultiple(of: 2) || str.count > 8 {
return nil
}
let scanner = Scanner(string: str)
var color: UInt64 = 0
scanner.scanHexInt64(&color)
if str.count == 2 {
let gray = Double(Int(color) & 0xFF) / 255
self.init(.sRGB, red: gray, green: gray, blue: gray, opacity: 1)
} else if str.count == 4 {
let gray = Double(Int(color >> 8) & 0x00FF) / 255
let alpha = Double(Int(color) & 0x00FF) / 255
self.init(.sRGB, red: gray, green: gray, blue: gray, opacity: alpha)
} else if str.count == 6 {
let red = Double(Int(color >> 16) & 0x0000FF) / 255
let green = Double(Int(color >> 8) & 0x0000FF) / 255
let blue = Double(Int(color) & 0x0000FF) / 255
self.init(.sRGB, red: red, green: green, blue: blue, opacity: 1)
} else if str.count == 8 {
let red = Double(Int(color >> 24) & 0x000000FF) / 255
let green = Double(Int(color >> 16) & 0x000000FF) / 255
let blue = Double(Int(color >> 8) & 0x000000FF) / 255
let alpha = Double(Int(color) & 0x000000FF) / 255
self.init(.sRGB, red: red, green: green, blue: blue, opacity: alpha)
} else {
return nil
}
}
}
I am trying to use it within the toolbarBackground
modifier like:
.toolbarBackground(
Color("##00FF00"),
for: .tabBar
)
and it's not working. Is the API still limited to where it can only use basic colors?
CodePudding user response:
It is not the toolbarBackground
modifier that is not working,
I suspect that it is your Color init?(_ hex: String) {...}
function that is not working.
Try this code example and code to convert hex to Color. Works well for me, including for the toolbarBackground
.
So to answer the question, no the API is not limited to where it can only use basic colors.
struct ContentView: View {
var body: some View {
TabView {
NavigationView {
List(0..<3, id: \.self) { i in
Text("item-\(i)").foregroundColor(Color(hex: "#0078d4"))
}
.navigationBarTitle("bar title")
.toolbarBackground(Color(hex: "#00FF00"), for: .tabBar)
.background(Color(hex: "#e2c9ed"))
}
}
}
}
extension Color {
init(hex: String) {
let trimHex = hex.trimmingCharacters(in: .whitespacesAndNewlines)
let dropHash = String(trimHex.dropFirst()).trimmingCharacters(in: .whitespacesAndNewlines)
let hexString = trimHex.starts(with: "#") ? dropHash : trimHex
let ui64 = UInt64(hexString, radix: 16)
let value = ui64 != nil ? Int(ui64!) : 0
// #RRGGBB
var components = (
R: CGFloat((value >> 16) & 0xff) / 255,
G: CGFloat((value >> 08) & 0xff) / 255,
B: CGFloat((value >> 00) & 0xff) / 255,
a: CGFloat(1)
)
if String(hexString).count == 8 {
// #RRGGBBAA
components = (
R: CGFloat((value >> 24) & 0xff) / 255,
G: CGFloat((value >> 16) & 0xff) / 255,
B: CGFloat((value >> 08) & 0xff) / 255,
a: CGFloat((value >> 00) & 0xff) / 255
)
}
self.init(.sRGB, red: components.R, green: components.G, blue: components.B, opacity: components.a)
}
}