Я пытаюсь создать контроллер представления, который работает как .popover
контроллер представления модального стиля представления. Поскольку всплывающая подсказка в дочернем контроллере представления должна располагаться на основе sourceView
или sourceItem
родителя, дочерний контроллер представления имеет ссылку на специфичный для родителя UIView
или UIBarButtonItem
.
(Поскольку я рисую большую часть содержимого в подсказке, я не могу использовать автоматическую разметку.)
Я настраиваю макет контроллера дочернего представления в viewDidLayoutSubviews()
, и он работал нормально, но проблема возникает при изменении ориентации устройства.
Когда ориентация устройства изменяется, child.viewDidLayoutSubviews()
вызывается до parent.viewDidLayoutSubviews()
, и это заставляет дочерний контроллер вида конфигурировать свою компоновку на основе старой компоновки контроллера родительского вида, которая предшествует изменению ориентации.
Кажется, единственный способ выяснить это - позвонить child.view.setNeedsLayout
с parent.viewDidLayoutSubviews()
, но я хочу оставить это как план Б.
Есть ли естественный способ справиться с этим?
ДОБАВЛЕНО
Я только что сделал пример проекта, чтобы убедиться.
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .yellow
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let vc = ModalViewController()
vc.modalPresentationStyle = .overCurrentContext
present(vc, animated: true, completion: nil)
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
print(#file)
}
}
class ModalViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .purple
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
print(#file)
}
}
Журнал был, как показано ниже:
// when loaded
TestProject/ViewController.swift
TestProject/ModalViewController.swift
// when rotated
TestProject/ModalViewController.swift
TestProject/ViewController.swift