Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Ao usar o navigationBarBackButtonHidden + botão custom, perde-se o deslizar da esquerda pra voltar

Esse gesto é quase universal no iOS, e eu acho super intuitivo. Nas novas versões do SwiftUI tem algum jeito de customizar o botão de voltar, e ainda manter o swipe da esquerda? Vi umas respostas no StackOverflow, mas são de alguns anos atrás, e mais complicadas que o meu nível atual de entendimento, kkkkk

5 respostas

Oi Arthur!

Pelas últimas versões do SwiftUI, ainda não existe um jeito direto e fácil de customizar o botão de voltar sem perder o gesto de swipe. Mas calma, não é o fim do mundo! Dá pra fazer algumas coisas.

Uma solução que muita gente tem usado é criar um botão customizado e, ao mesmo tempo, usar a propriedade navigationBarBackButtonHidden. Isso mantém o gesto de swipe, enquanto você exibe o botão que você criou.

Algo mais ou menos assim:

struct ContentView: View {
    @State private var isNavigationBarHidden: Bool = true

    var body: some View {
        NavigationView {
            VStack {
                // Seu conteúdo aqui
            }
            .navigationBarBackButtonHidden(self.isNavigationBarHidden)
            .navigationBarItems(leading:
                Button(action: {
                    // Aqui você coloca a ação do seu botão
                }) {
                    // Aqui você personaliza o visual do seu botão
                }
            )
            .onAppear {
                // Essa parte aqui é para esconder a barra de navegação na primeira tela
                self.isNavigationBarHidden = true
            }
            .onDisappear {
                // E aqui é para garantir que a barra esteja visível nas outras telas
                self.isNavigationBarHidden = false
            }
        }
    }
}

Isso não é perfeito, mas pode ser uma solução temporária enquanto a Apple não nos dá um jeito mais direto de fazer isso.

E ai, tudo bem?

Então, mas na aula em questão a gente já faz um botão customizado e esconde o botão de voltar com o navigationBarBackButtonHidden.

Eu fiz do jeito que você mostrou também, e não consigo usar o swipe da esquerda com nenhum dos dois. Só funciona quando desativo esse botão custom e volto a mostrar o botão original da navigationview, que diz "Back".

solução!

Oi Arthur, tudo certo?

Sim, ao criar um botão personalizado, de fato perdemos o swipe left pra voltar pra view anterior.

Não sei exatamente o que você viu no Stack Overflow, mas praticamente temos duas abordagens pra isso hoje:

  1. Integrar UIKit no SwiftUI através do UIViewControllerRepresentable e usar o objeto do tipo UINavigationController pra habilitar este gesto.
  2. Utilizar do gesto chamado de 'drag gesture' no SwiftUI. O código ficaria algo do tipo:
struct CustomBackButtonView: View {
    @Environment(\.presentationMode) var presentationMode
    var body: some View {
        NavigationView {
            VStack {
                // Coisas do botão aqui
            }
            .gesture(DragGesture().onEnded { value in
                if value.translation.width > 100 {
                    // Faz uma verificação se o valor da posição em que o gesto parou é maior que 100, daí volta pra tela anterior
                    self.presentationMode.wrappedValue.dismiss()
                }
            })
        }
    }
}

Se você nunca viu sobre DragGesture, no curso de SwiftUI com animações que temos aqui na plataforma aborda bastante sobre esse gesto, e você vai se familiarizar melhor com ele. É o próximo curso da formação.

Espero ter ajudado. Qualquer coisa manda aqui. Abraços!

Bom dia professora!

Vou tentar implementar desse jeito com o DragGesture, ainda não vi muita coisa sobre ele mas vou fuçar.

Estou gostando muito dessa formação nova de SwiftUI, vc e o Andriu estão de parabéns.

Depois me conta se deu certo! Se quiser compartilhar sua solução também, adoraria ver! Pode ser aqui ou lá no Discord.

E fico muito feliz que esteja gostando!

Conte conosco sempre.