UIОтличие в ориентации окна между устройствами iPhone и iPad - PullRequest
0 голосов
/ 15 июня 2019

Я пытаюсь создать пользовательское окно UIWindow для поведения наложения, и везде я видел, что «UIWindow не основано на ориентации»; Ведьма это именно то, что я хочу, так как я хочу соответствовать границам физического устройства.

На iPhone все выглядит нормально, UIWindow остается согласованным, и у меня хорошее и спокойное поведение; границы не двигаются при повороте устройства: iPhone preview

На iPad с той же версией, точно таким же кодом, Я получаю анимацию вращения на своем слое UIWindow (которое я использую для рисования границ), и это приводит к появлению этого странного макета: iPad preview

Я не использую уведомление о ротации; потому что я не хочу отвечать на повороты. Я использую нативно-ориентированные границы UIScreen nativeBounds, чтобы убедиться, что у меня нет чего-то, что чувствительно к ориентации. Такое разное поведение на разных устройствах делает меня неудобным.

Кто-то уже сталкивался с таким странным поведением? Как вы на это реагируете? Есть хорошая практика или обходной путь?

Полный код проекта, включая примеры приложений, находится здесь: https://github.com/Dean151/RecordingOverlay

Конкретный код оверлея и подкласса UIWindow находится здесь: https://github.com/Dean151/RecordingOverlay/blob/master/Sources/RecordingOverlay/RecordingOverlay.swift

1 Ответ

0 голосов
/ 15 июня 2019

Оказывается, что при соблюдении определенных условий окна автоматически поворачиваются.Мне пришлось переопределить поворот, когда все эти параметры будут выполнены.

UIWindow будет вращаться автоматически, если все это верно:

  • iOS по крайней мере 9,0
  • устройство - iPad
  • Приложение поддерживает ротацию всех устройств
  • Приложения используют раскадровку в качестве основного интерфейса (объявлено в info.plist)
  • Приложениям не требуется полноэкранный режим (объявлен вinfo.plist)

Вы можете обнаружить это с помощью небольшого фрагмента:

@available(iOS 9.0, *)
var willAutorotate: Bool {
    guard UIDevice.current.userInterfaceIdiom == .pad else {
      return false
    }

    let window = UIApplication.shared.delegate?.window ?? nil
    guard UIApplication.shared.supportedInterfaceOrientations(for: window) == .all else {
        return false
    }

    let info = Bundle.main.infoDictionary ?? [:]
    guard info["UIRequiresFullScreen"] as? Bool != true else {
        return false
    }

    guard info["UILaunchStoryboardName"] != nil else {
        return false
    }

    return true
}

Теперь, когда я знаю, когда он будет автоматически поворачиваться, я мог бы изменить кадр и преобразовать в«отменить» вращение.

...