SwiftUI Передайте два дочерних вида для просмотра - PullRequest
1 голос
/ 23 марта 2020

Я пытаюсь передать два представления как потомков вида, используя @ViewBuilder.

Мне нужно знать, какой из них первый, а какой второй, поскольку я хочу показать одно или другое в зависимости от какого-либо состояния.

Я смог выполнить эту работу не обобщенным c способом, то есть я явно указал типы дочерних представлений.

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)))

            }
        }
    }

Как я могу сделать это более обобщенным c, избавившись от моих типов FeedItem. Мне бы хотелось, чтобы два вида были двумя разными типами.

1 Ответ

3 голосов
/ 23 марта 2020

Здесь возможен вариант. Протестировано с 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)))

            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...