iOS - неправильные границы UIScreen в 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

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 ключ.

Другие вопросы по тегам