ViewDidLayout контроллера дочернего представления вызывается перед viewDidLayout родителя - PullRequest
0 голосов
/ 17 апреля 2019

Я пытаюсь создать контроллер представления, который работает как .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

1 Ответ

1 голос
/ 17 апреля 2019

Здесь что-то не так. layoutSubviews распространяется сверху вниз. Если это не то, что вы видите, возможно, ваши переопределения каким-то образом подрывают нормальные механизмы. Убедитесь, что вы звоните super во всех соответствующих переопределениях, и что вы не форсируете преждевременное расположение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...