web-dev-qa-db-fra.com

SwiftUI: vue partagée indésirable sur iPad

Problème: une vue sur Pad apparaît avec indésirable vue partagée.

Ma configuration actuelle est: Catalina OSX beta 5 + Xcode 11 Beta 5

Voici le code que j'ai utilisé, avec une vue de navigation et un titre de navigation:

import SwiftUI

struct SwiftUIView: View {
    var body: some View {
        NavigationView {
            Text("Search")
                .navigationBarTitle(Text("Search"))
        }
    }
}

#if DEBUG
struct SwiftUIView_Previews: PreviewProvider {
    static var previews: some View {
        SwiftUIView()
    }
}
#endif

Lorsque simulé sur iPad (appareil physique et aperçu) au lieu d'une vue plein écran, j'obtiens cette vue d'écran partagé:

Unwanted split view with NavigationView

Si je n'ai qu'une vue, sans NavigationView, j'obtiens une vue plein écran:

import SwiftUI

struct SwiftUIView: View {
    var body: some View {
        Text("Hello World!")
    }
}

#if DEBUG
struct SwiftUIView_Previews: PreviewProvider {
    static var previews: some View {
        SwiftUIView()
    }
}
#endif

Full screen, but without NavigationView

Comment puis-je créer un plein écran NavigationView (pas un écran partagé) sur iPad?

13
Mane Manero

Vous pouvez appliquer le modificateur .navigationViewStyle(StackNavigationViewStyle()) à NavigationView!

... 
    NavigationView {
        Text("Hello world!")
    }
    .navigationViewStyle(StackNavigationViewStyle())
...

Edit: Ci-dessous, je réponds aux questions d'Alexandre de son commentaire:

  • Pourquoi la vue complète n'est pas la valeur par défaut pour l'iPad? Ce n'est qu'un choix fait par Apple ...

  • Pourquoi ce modificateur va à l'extérieur de la fermeture de NavigationView, alors que le titre de navigation va à l'intérieur ... Peut-être que cela donne des éclaircissements: https: // stackoverflow .com/a/57400873/11432719

31
cbjeukendrup

Pour utiliser ce style divisé pour iPad mais supprimer pour iPhone:

    extension View{
    func phoneOnlyStackNavigationView() ->some View{

        if UIDevice.current.userInterfaceIdiom == .phone{
            return AnyView(self.navigationViewStyle(StackNavigationViewStyle()))
        }else{
            return AnyView(self)
        }
    }
}
0
Atif Shabeer