SwiftUI:将两个子视图传递给视图

3

我试图使用@ViewBuilder将两个视图作为一个View的子项传递。

我需要知道哪个是第一个视图,哪个是第二个视图,因为我想根据某些状态显示其中之一。

我已经以非泛型的方式使其工作,也就是说,我明确给出了子视图的类型。

struct FlippableView<Content: View>: View {
    @State private var flipped = false
    @State private var degrees = 0.0

    var frontCard: FeedItem
    var backCard: FeedItem

    @inlinable public init(@ViewBuilder content: () -> Content) {
        var t = content() as! TupleView<(FeedItem, FeedItem)>
        self.frontCard = t.value.0
        self.backCard = t.value.1
    }

    var body: some View {
        return Group() {
            if self.degrees < 90 {
                self.frontCard
            } else {
                self.backCard
                    .rotation3DEffect(Angle(degrees: 180), axis: (x: CGFloat(0), y: CGFloat(10), z: CGFloat(0)))

            }
        }
    }

我该如何使这个更加通用,通过消除我的FeedItem类型。我想让这两个视图成为两种不同的视图类型。
1个回答

6

以下是可能的解决方案。已在Xcode 11.4 / iOS 13.4上进行了测试。

struct FlippableView<V1: View, V2: View>: View {
    @State private var flipped = false
    @State private var degrees = 0.0

    var frontCard: V1
    var backCard: V2

    @inlinable public init(@ViewBuilder content: () -> TupleView<(V1, V2)>) {
        let t = content()
        self.frontCard = t.value.0
        self.backCard = t.value.1
    }

    var body: some View {
        return Group() {
            if self.degrees < 90 {
                self.frontCard
            } else {
                self.backCard
                    .rotation3DEffect(Angle(degrees: 180), axis: (x: CGFloat(0), y: CGFloat(10), z: CGFloat(0)))

            }
        }
    }
}

我无法弄清如何调用 FlippableView。 你能否提供一个小例子展示如何调用它?谢谢! - titusmagnus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接