Swiftui:从 JSON 获取动态颜色渐变?
Swiftui: Fetch Dynamic Color Gradient from JSON?
对于数组中的每个项目,我想加载 JSON 中定义的动态颜色渐变。每个项目都有不同的颜色。
在 JSON 中,我将十六进制值存储在 [String] 中。我可以使用这些从此处使用扩展名加载 Color(hex: String):
我正在考虑按照以下思路进行实施,但是 Xcode 会抛出各种错误,此外,感觉就像一个 hack。我错过了什么?
示例模型:
struct Item: Codable, Identifiable, Hashable {
let colors: [String]
}
详细视图示例:
struct DetailView: View {
let item: Item
let gradientColors: [Color]
init(item: Item){
self.item = item
ForEach(item.colors) { color in
gradientColors.append(Color(hex: color))
}
}
var body: some View {
Circle()
.background(LinearGradient(gradient: Gradient(colors: gradientColors), startPoint: .leading, endPoint: .trailing))
}
}
在 SwiftUI 中,ForEach
是一个视图,可以让您传递一组数据视图,类似于 UIKit 中 UIView
的子视图。所以你不能在 init 方法中使用它。更多 (https://developer.apple.com/documentation/swiftui/foreach)
正确使用代码:
struct Item: Codable, Identifiable {
var id = UUID()
let colors: [String]
}
struct ContentView: View {
let item: Item
init(item: Item){
self.item = item
}
var body: some View {
Circle()
.fill(LinearGradient(gradient: Gradient(colors: item.colors.map{Color(hex: [=10=])}), startPoint: .leading, endPoint: .trailing))
}
}
如果您想使用 forEach
迭代数组,您需要使用与旧方法相同的方法。
示例:
struct ContentView: View {
let item: Item
var gradientColors: [Color] = []
init(item: Item){
self.item = item
item.colors.forEach { (strColor) in
gradientColors.append(Color(hex: strColor))
}
}
var body: some View {
Circle()
.fill(LinearGradient(gradient: Gradient(colors: gradientColors), startPoint: .leading, endPoint: .trailing))
}
}
另外,还有一件事。如果您尝试向圆圈添加渐变,它不适用于 .background(LinearGradient
。为此,您需要使用 .fill
var body: some View {
Circle()
.fill(LinearGradient(gradient: Gradient(colors: gradientColors), startPoint: .leading, endPoint: .trailing))
}
对于数组中的每个项目,我想加载 JSON 中定义的动态颜色渐变。每个项目都有不同的颜色。
在 JSON 中,我将十六进制值存储在 [String] 中。我可以使用这些从此处使用扩展名加载 Color(hex: String):
我正在考虑按照以下思路进行实施,但是 Xcode 会抛出各种错误,此外,感觉就像一个 hack。我错过了什么?
示例模型:
struct Item: Codable, Identifiable, Hashable {
let colors: [String]
}
详细视图示例:
struct DetailView: View {
let item: Item
let gradientColors: [Color]
init(item: Item){
self.item = item
ForEach(item.colors) { color in
gradientColors.append(Color(hex: color))
}
}
var body: some View {
Circle()
.background(LinearGradient(gradient: Gradient(colors: gradientColors), startPoint: .leading, endPoint: .trailing))
}
}
在 SwiftUI 中,ForEach
是一个视图,可以让您传递一组数据视图,类似于 UIKit 中 UIView
的子视图。所以你不能在 init 方法中使用它。更多 (https://developer.apple.com/documentation/swiftui/foreach)
正确使用代码:
struct Item: Codable, Identifiable {
var id = UUID()
let colors: [String]
}
struct ContentView: View {
let item: Item
init(item: Item){
self.item = item
}
var body: some View {
Circle()
.fill(LinearGradient(gradient: Gradient(colors: item.colors.map{Color(hex: [=10=])}), startPoint: .leading, endPoint: .trailing))
}
}
如果您想使用 forEach
迭代数组,您需要使用与旧方法相同的方法。
示例:
struct ContentView: View {
let item: Item
var gradientColors: [Color] = []
init(item: Item){
self.item = item
item.colors.forEach { (strColor) in
gradientColors.append(Color(hex: strColor))
}
}
var body: some View {
Circle()
.fill(LinearGradient(gradient: Gradient(colors: gradientColors), startPoint: .leading, endPoint: .trailing))
}
}
另外,还有一件事。如果您尝试向圆圈添加渐变,它不适用于 .background(LinearGradient
。为此,您需要使用 .fill
var body: some View {
Circle()
.fill(LinearGradient(gradient: Gradient(colors: gradientColors), startPoint: .leading, endPoint: .trailing))
}