SwiftUI — определение текущего устройства и ориентацииIOS

Программируем под IOS
Ответить
Anonymous
 SwiftUI — определение текущего устройства и ориентации

Сообщение Anonymous »

Я пытаюсь определить, когда устройство находится на iPad и в портретном режиме.
В настоящее время я использую API UIDevice в UIKit и использую объект среды для отслеживания изменений. Я использую решение, найденное здесь — Определение текущего устройства и ориентации.
Однако ориентацияInfo.orientation изначально всегда равна .portrait, пока не будет повернута в портретную, а затем обратно в альбомную ориентацию.
Итак, при выполнении следующих действий для отображения FABView
struct HomeView: View {

@EnvironmentObject var orientationInfo: OrientationInfo
let isPhone = UIDevice.current.userInterfaceIdiom == .phone

var body: some View {
ZStack(alignment: .bottom) {
#if os(iOS)
if isPhone == false && orientationInfo.orientation == .portrait {
FABView()
}
#endif
}
}
}

Просмотр загружается, когда iPad изначально находится в альбомной ориентации, но при переключении на книжную и обратно в альбомную затем удаляется. Почему это происходит и как я могу убедиться, что представление не загружается при первой загрузке?
Полный код
struct HomeTab: View {

var body: some View {
NavigationView {
HomeView()
.environmentObject(OrientationInfo())
}
}
}

struct HomeView: View {

@EnvironmentObject var orientationInfo: OrientationInfo
let isPhone = UIDevice.current.userInterfaceIdiom == .phone

var body: some View {
ZStack(alignment: .bottom) {
#if os(iOS)
if isPhone == false && orientationInfo.orientation == .portrait {
FABView()
}
#endif
}
}
}

final class OrientationInfo: ObservableObject {
enum Orientation {
case portrait
case landscape
}

@Published var orientation: Orientation

private var _observer: NSObjectProtocol?

init() {
// fairly arbitrary starting value for 'flat' orientations
if UIDevice.current.orientation.isLandscape {
self.orientation = .landscape
}
else {
self.orientation = .portrait
}

// unowned self because we unregister before self becomes invalid
_observer = NotificationCenter.default.addObserver(forName: UIDevice.orientationDidChangeNotification, object: nil, queue: nil) { [unowned self] note in
guard let device = note.object as? UIDevice else {
return
}
if device.orientation.isPortrait {
self.orientation = .portrait
}
else if device.orientation.isLandscape {
self.orientation = .landscape
}
}
}

deinit {
if let observer = _observer {
NotificationCenter.default.removeObserver(observer)
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/655 ... rientation
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»