SwiftUI过渡不适用于视图数组

时间:2020-07-31 20:24:14

标签: ios swiftui transition

我有一个简单的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)
        ])

任何见识都将不胜感激。我觉得这很明显,我没看到。

1 个答案:

答案 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领域。