SwiftUI将两个子视图传递到视图

问题描述 投票:1回答:1

我正在尝试使用@ViewBuilder作为视图的子级传递两个视图。

我需要能够知道哪个是第一个,而哪个是第二个,因为我想根据某个状态显示一个或另一个。

我能够以一种非通用的方式进行这项工作,这意味着我明确给出了子视图的类型。

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类型使它变得更通用。我希望两个视图成为两种不同的视图类型。

swift swiftui
1个回答
3
投票

这里是可能的变体。经过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)))

            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.