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