iOS SwiftUI: отображать или отклонять вид программно - PullRequest
6 голосов
/ 09 июня 2019

Я не смог найти никаких ссылок о способах pop или отклонить программно моего представленного представления с SwiftUI.

Мне кажется, что единственный способ - это использовать уже интегрированное слайд-действие для модального окна (и что / как, если я хочу отключить эту функцию?) И кнопку возврата для стека навигации.

Кто-нибудь знает решение?Вы знаете, если это ошибка, или она останется такой?

Ответы [ 2 ]

2 голосов
/ 09 июня 2019

Вы можете попробовать использовать пользовательский вид и Transition.

Вот пользовательский модал.

struct ModalView<Content>: View where Content: View {

    @Binding var isShowing: Bool
    var content: () -> Content

    var body: some View {
        GeometryReader { geometry in
            ZStack(alignment: .center) {
                if (!self.isShowing) {
                    self.content()
                }
                if (self.isShowing) {
                    self.content()
                        .disabled(true)
                        .blur(radius: 3)

                    VStack {
                        Text("Modal")
                    }
                    .frame(width: geometry.size.width / 2,
                           height: geometry.size.height / 5)
                    .background(Color.secondary.colorInvert())
                    .foregroundColor(Color.primary)
                    .cornerRadius(20)
                    .transition(.moveAndFade) // associated transition to the modal view
                }
            }
        }
    }

}

Я повторно использовал Transition.moveAndFade из учебника Анимация и переход .

Это определяется так:

extension AnyTransition {
    static var moveAndFade: AnyTransition {
        let insertion = AnyTransition.move(edge: .trailing)
            .combined(with: .opacity)
        let removal = AnyTransition.scale()
            .combined(with: .opacity)
        return .asymmetric(insertion: insertion, removal: removal)
    }
}

Вы можете проверить это - в симуляторе, а не в предварительном просмотре - как это:

struct ContentView: View {

    @State var isShowingModal: Bool = false

    func toggleModal() {
        DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
            withAnimation {
                self.isShowingModal = true
            }
            DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
                withAnimation {
                    self.isShowingModal = false
                }
            }
        }
    }

    var body: some View {
        ModalView(isShowing: $isShowingModal) {
            NavigationView {
                List(["1", "2", "3", "4", "5"].identified(by: \.self)) { row in
                    Text(row)
                }.navigationBarTitle(Text("A List"), displayMode: .large)
            }.onAppear { self.toggleModal() }
        }
    }

}

Благодаря этому переходу вы увидите модальный sliding in from the trailing edge, и он будет zoom and fade out when it is dismissed.

0 голосов
/ 15 июня 2019

Основная концепция SwiftUI - следить за потоком данных.

Вы должны использовать переменную @State и изменить значение этой переменной для управления выталкиванием и отменой.

struct MyView: View {
    @State
    var showsUp = false

    var body: some View {
        Button(action: { self.showsUp.toggle() }) {
            Text("Pop")
        }
        .presentation(
            showsUp ? Modal(
                Button(action: { self.showsUp.toggle() }) {
                    Text("Dismiss")
                }
            ) : nil
        )
    }
}

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