我正在尝试制作一个视图控制器,它的工作方式类似于.popover
模式表示样式的视图控制器。因为子视图控制器中的工具提示应该基于父视图的sourceView
或sourceItem
进行布局,所以子视图控制器引用父视图的特定UIView
或UIBarButtonItem
。
(因为我在工具提示中绘制了大部分内容,所以不能使用自动布局。)
我在viewDidLayoutSubviews()
中配置了子视图控制器的布局,它工作正常,但当设备方向改变时会出现问题。
当设备方向改变时,child.viewDidLayoutSubviews()
在parent.viewDidLayoutSubviews()
之前被调用,它使子视图控制器基于父视图控制器在方向改变之前的旧布局来配置其布局。
看来唯一的办法是从child.view.setNeedsLayout
调用parent.viewDidLayoutSubviews()
,但我想把它作为一个计划B。
有没有一种自然的方法来处理这个问题?
补充
我只是做了一个样本项目来确定。
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
最佳答案
这里出了点问题。layoutSubviews
从上往下传播。如果这不是你看到的,也许你的重写以某种方式破坏了正常的机制。确保在所有相关重写中调用super
,并且没有强制过早布局。