gpt4 book ai didi

ios - subview Controller 的 viewDidLayout 在父 View Controller 的 viewDidLayout 之前调用

转载 作者:行者123 更新时间:2023-11-28 13:43:39 24 4
gpt4 key购买 nike

我正在尝试制作一个像 .popover 模态呈现样式 View Controller 一样工作的 View Controller 。因为 subview Controller 中的工具提示应该基于父级的 sourceViewsourceItem 进行布局,所以 subview Controller 会引用父级的特定 UIViewUIBarButtonItem.

(因为我在工具提示中绘制了大部分内容,所以无法使用自动布局。)

我在 viewDidLayoutSubviews() 中配置了 subview Controller 的布局,它工作正常,但当设备方向改变时出现问题。

当设备方向改变时,child.viewDidLayoutSubviews()parent.viewDidLayoutSubviews() 之前被调用,它使 subview Controller 基于父视​​图 Controller 配置其布局 View Controller 在方向更改之前的旧布局。

似乎唯一的办法是从 parent.viewDidLayoutSubviews() 调用 child.view.setNeedsLayout,但我想把它留作 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 并且您没有强制过早布局。

关于ios - subview Controller 的 viewDidLayout 在父 View Controller 的 viewDidLayout 之前调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55716586/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com