SwiftUI — работа с обычными / обычными классами размеров на iPad

#ipad #swiftui #landscape #size-classes #portrait

#iPad #swiftui #пейзаж #классы размеров #портрет

Вопрос:

Мне нужно сделать другой макет для iPad в альбомной и портретной ориентации, но классы размеров на iPad всегда обычные / регулярные. Рекомендуемый Apple способ адаптации интерфейсов — использовать адаптивную компоновку с классами размеров, но на iPad нет разницы между портретным и альбомным режимами.

Есть ли какой-либо способ представить другой макет в книжной и альбомной ориентации на iPad без ориентации устройства обнаружения?

В качестве примера, на iPhone (компактный / обычный) будет отображаться как:

введите описание изображения здесь

А на iPad в альбомной ориентации (обычный / обычный) будет отображаться как: введите описание изображения здесь

Итак, цель состоит в том, чтобы показать макет iPhone на iPad в портретном режиме.

Спасибо!

Комментарии:

1. Apple рекомендует одинаковую раскладку как для портретной, так и для альбомной ориентации на iPad

Ответ №1:

Вы можете принудительно применить класс горизонтального размера в зависимости от ориентации. Если я правильно понял вашу цель, вот демонстрация возможного подхода (протестирована с Xcode 12.1 / iOS 14.1):

 struct DemoViewSizes: View {
    @Environment(.horizontalSizeClass) var horizontalSizeClass

    @State private var orientation = UIDevice.current.orientation

    var body: some View {
        Text("root_view_here")
            .onReceive(NotificationCenter.default.publisher(for: UIDevice.orientationDidChangeNotification)) { _ in
                orientation = UIDevice.current.orientation
            }
            .environment(.horizontalSizeClass, orientation == .portrait ? .compact : .regular)
    }
}