Есть ли у вас опыт работы с SwifUI NavigationView в альбомной ориентации на симуляторе iPhone XR?

Я попытался запустить свое приложение в альбомной ориентации на симуляторе iPhone XR и получил пустой экран.

Код ниже мой тест. Он корректно работает на симуляторе iPhone 8, а не на симуляторе iPhone XR, если я удалю NavigationView.

import SwiftUI

struct ContentView: View {
    var body: some View {
        NavigationView {
            GeometryReader { gp in
                VStack(alignment: HorizontalAlignment.center) {
                    Text("Width: \(gp.size.width)")
                    Text("Height: \(gp.size.height)")
                }
            }
        }
    }
}

Я ожидаю, что увижу размер экрана как в альбомной, так и в портретной ориентации.

У кого-нибудь есть опыт работы с этой комбинацией?

3 ответа

Решение

Нет ничего плохого. Просто, когда большой iPhone в альбомной ориентации, его класс горизонтального размера установлен на .regular, вместо .compact, Думайте об этом, как будто это был iPad.

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

Если вы измените свой код, чтобы добавить представление по умолчанию, когда ничего не выбрано, вы получите этот другой вид:

struct ContentView: View {
    var body: some View {
        NavigationView {
            GeometryReader { gp in
                VStack(alignment: HorizontalAlignment.center) {
                    Text("Width: \(gp.size.width)")
                    Text("Height: \(gp.size.height)")
                    NavigationLink(destination: Text("Something got selected")) { Text("Select something") }
                }

            }

            Text("No Selection")
        }
    }
}

И если вы хотите, чтобы это.compact, вы делаете следующее:

struct ContentView: View {
    var body: some View {
        NavigationView {
            GeometryReader { gp in
                VStack(alignment: HorizontalAlignment.center) {
                    Text("Width: \(gp.size.width)")
                    Text("Height: \(gp.size.height)")
                    NavigationLink(destination: Text("Something got selected")) { Text("Select something") }
                }

            }

            Text("No Selection")
        }.environment(\.horizontalSizeClass, .compact)
    }
}

Добавление этого модификатора в NavigationView приводит к отключению основных подробных представлений.

NavigationView {
  // Code
}
.environment(\.horizontalSizeClass, .compact) 

Другой способ решить эту проблему — заставить NavigationView использовать стиль стека.

      NavigationView {
    Text("Hello World")
    }.navigationViewStyle(StackNavigationViewStyle())

Или новее:

      NavigationView {
    Text("Hello World")
    }.navigationViewStyle(.stack)
Другие вопросы по тегам