iOS - Неверные границы экрана UIS в viewWillTransition для iPad

Мне нужно проверить, изменилось ли ориентация моего устройства в iOS 8+.

Мой подход:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    let isLand = UIScreen.main.bounds.width > UIScreen.main.bounds.height

    coordinator.animate(alongsideTransition: nil) { _ in
        let isLand2 = UIScreen.main.bounds.width > UIScreen.main.bounds.height


        print("\(isLand) -> \(isLand2)")
    }
}

он отлично работает на iPhone, но в iPad isLand уже имеет новое значение, которое должно быть после завершения ориентации, поэтому:

Портрет> Пейзаж: true -> true

Пейзаж> Портрет: false -> false

Согласно документации, границы должны меняться вместе с ориентацией, поэтому у них должны быть границы до и после, не так ли?

Основные границы UIScreen:

Этот прямоугольник указывается в текущем координатном пространстве, которое учитывает любые повороты интерфейса, действующие для устройства. Следовательно, значение этого свойства может измениться при повороте устройства между книжной и альбомной ориентацией.

В то время как он отлично работает как на iPhone, так и на iPad, если я использую границы текущего контроллера корневого представления следующим образом:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    let isLand = UIApplication.shared.keyWindow!.rootViewController!.view.bounds.width > UIApplication.shared.keyWindow!.rootViewController!.view.bounds.height

    coordinator.animate(alongsideTransition: nil) { _ in
        let isLand2 = UIApplication.shared.keyWindow!.rootViewController!.view.bounds.width > UIApplication.shared.keyWindow!.rootViewController!.view.bounds.height


        print("\(isLand) -> \(isLand2)")
    }
}

Портрет> Пейзаж: false -> true

Пейзаж> Портрет: true -> false


person Marco Santarossa    schedule 14.03.2017    source источник
comment
Вызывается ли метод viewWillTransition () до или после viewDidAppear?   -  person luca    schedule 14.03.2017


Ответы (1)


Вместо этого вам следует попробовать использовать containerView контекста координатора.

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    let isLand = coordinator.containerView.bounds.width > coordinator.containerView.bounds.height

    coordinator.animate(alongsideTransition: nil) { _ in
        let isLand2 = coordinator.containerView.bounds.width > coordinator.containerView.bounds.height

        print("\(isLand) -> \(isLand2)")
    }

}

Если вы хотите получить дополнительную информацию о переходе, вы можете использовать func view(forKey: UITransitionContextViewKey) и func viewController(forKey: UITransitionContextViewControllerKey) с помощью клавиши .from.

person Oliver Atkinson    schedule 14.03.2017