gpt4 book ai didi

ios - 在 Swift/SwiftUI 中包含多种 View 类型的数组

转载 作者:行者123 更新时间:2023-12-01 21:26:15 24 4
gpt4 key购买 nike

我想创建一个 View ,人们可以在其中选择他们喜欢的背景图像,其中包括具有前景色的矩形或图像。到目前为止,我已经通过创建这个来完成这个工作
结构:

struct BackgroundImage : Identifiable{
var background : AnyView
let id = UUID()
}
我将它们添加到这样的数组中
查看型号:
class VM : ObservableObject{
@Published var imageViews : Array<BackgroundImage> = Array<BackgroundImage>()

init(){
imageViews.append(BackgroundImage(background: AnyView(Rectangle().foregroundColor(Color.green))))
imageViews.append(BackgroundImage(background: AnyView(Rectangle().foregroundColor(Color.yellow))))
imageViews.append(BackgroundImage(background: AnyView(Image("Testimage"))))
}
这使我可以像这样循环遍历 BackgroundImages 数组
查看:
LazyVGrid(columns: [GridItem(.flexible()), GridItem(.flexible())]) {
ForEach(VM.imageViews, id: \.self.id) { view in
ZStack{
view.background
//.resizable()
//.aspectRatio(contentMode: .fill)
.frame(width: g.size.width/2.25, height: g.size.height/8)
.clipShape(RoundedRectangle(cornerRadius: 10, style: .continuous))
}
}
}
但是我无法添加
 .resizable()
.aspectRatio(contentMode: .fill)
对于图像,因为 AnyView 不允许这样做。
有没有更好的方法来实现这一目标?我应该只为 Shapes/Images 设置两个单独的数组吗?或者是否有一个更适合这个的替代 View 结构?
谢谢!

最佳答案

正如@DávidPásztor 在评论中提到的那样,将 View 存储在您的 View 模型中是一个糟糕的设计。
实际上,您只需要存储颜色和图像名称。让 View 构建代码构建实际 View 。
这是一个可能的实现。

struct BackgroundItem: Identifiable {
private let uicolor: UIColor?
private let imageName: String?
let id = UUID()

var isImage: Bool { imageName != nil }
var color: UIColor { uicolor ?? .white }
var name: String { imageName ?? "" }

init(name: String? = nil, color: UIColor? = nil) {
imageName = name
uicolor = color
}
}

class VM : ObservableObject{
@Published var imageItems: [BackgroundItem] = []

init() {
imageItems = [.init(color: .green),
.init(color: .blue),
.init(name: "TestImage")]
}
}

struct ContentView: View {
@ObservedObject var vm = VM()

var body: some View {
GeometryReader { g in
LazyVGrid(columns: [GridItem(.flexible()), GridItem(.flexible())]) {
ForEach(vm.imageItems) { item in
ZStack{
if item.isImage {
Image(item.name)
.resizable()
.aspectRatio(contentMode: .fill)
} else {
Color(item.color)
}
}
.frame(width: g.size.width/2.25, height: g.size.height/8)
.clipShape(RoundedRectangle(cornerRadius: 10, style: .continuous)
}
}
}
}
}
注:我想过使用 enum存储 imageName 和颜色之间的区别,但最简单的方法是使用可选项并存储我需要的选项。使用向 View 构建代码公开的接口(interface),您可以轻松地将实现更改为您希望存储信息的方式。

关于ios - 在 Swift/SwiftUI 中包含多种 View 类型的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63466560/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com