我有一个简单的View,它包含一个View数组。这个想法是,单击可见视图会将下一个视图滑动到位。如果我用常量索引我的Views数组,这很好用,但是如果索引是@State var,则不起作用。
这是行不通的:
struct ImageCarousel<Page : View>: View {
let pages:[Page]
@State private var currentImage = 0
init(_ views:[Page]) {
pages = views
}
var body: some View {
VStack {
pages[self.currentImage]
.transition(.slide)
.animation(.easeInOut)
.onTapGesture {
withAnimation {
self.currentImage = self.currentImage+1 >= self.pages.count ? 0 : self.currentImage+1
}
}
}
}
}
但是此版本的body
可以使用,但没有用:
var body: some View {
VStack {
if self.currentImage == 0 {
pages[0]
.transition(.slide)
.animation(.easeInOut)
.onTapGesture {
withAnimation {
self.currentImage = 1
}
}
} else {
pages[1]
.transition(.slide)
.animation(.easeInOut)
.onTapGesture {
withAnimation {
self.currentImage = 0
}
}
}
}
}
如果我没有IF
语句,而只使用pages[self.currentImage]
,则过渡无效。
您可以这样使用此视图:
ImageCarousel([
Rectangle().foregroundColor(.red),
Rectangle().foregroundColor(.orange),
Rectangle().foregroundColor(.yellow),
Rectangle().foregroundColor(.green),
Rectangle().foregroundColor(.blue),
Rectangle().foregroundColor(.purple)
])
任何见识都将不胜感激。我觉得这很明显,我没看到。
答案 0 :(得分:0)
我想出了一个不太复杂的解决方案(更多是hack):暂时将当前的View
替换为虚拟的View
,并在出现时触发下一个{{1 }} 出现。这样就满足了删除View
并将其替换为另一个View
的条件:
View
在这种简化的情况下,这很好用。如果没有必要,我真的不想进入var body: some View {
ZStack {
if self.currentImage == -1 {
Rectangle()
.foregroundColor(.gray)
.onAppear {
self.currentImage = self.nextImage
}
} else {
pages[self.nextImage]
.transition(.slide)
.animation(.easeInOut)
.onTapGesture {
withAnimation {
self.nextImage = self.nextImage+1 >= self.pages.count ? 0 : self.nextImage+1
self.currentImage = -1
}
}
}
}
}
或UIScrollView
领域。