gpt4 book ai didi

ios - topLayoutGuide 在 vi​​ewWillAppear 之后应用

转载 作者:可可西里 更新时间:2023-11-01 00:57:09 24 4
gpt4 key购买 nike

我有一个问题,UIViewController(来自 XIB)中的 topLayoutGuide.lengthviewWillAppear 之后设置,我不知道如何 Hook topLayoutGuide.length 的更改以初始设置 TableView 的 contentOffset。

UINavigationController 中模态呈现 UIViewController 的代码:

let viewController = UIViewController(nibName: "ViewController", bundle: nil)
let navigationController = UINavigationController(rootViewController: viewController)
present(navigationController, animated: true, completion: nil)

关于 topLayoutGuide.length 我的调试输出

Init view controller
-[UIViewController topLayoutGuide]: guide not available before the view controller's view is loaded
willMove toParentViewController - top layout guide nan
Init navigation controller and pass view controller as root vc
Present navigation controller modally
viewDidLoad - top layout guide 0.0
viewWillAppear - top layout guide 0.0
viewWillLayoutSubviews - top layout guide 64.0
viewDidLayoutSubviews - top layout guide 64.0
viewWillLayoutSubviews - top layout guide 64.0
viewDidLayoutSubviews - top layout guide 64.0
viewDidAppear - top layout guide 64.0
didMove toParentViewController - top layout guide 64.0
viewWillLayoutSubviews - top layout guide 64.0
viewDidLayoutSubviews - top layout guide 64.0

现在我在 View Controller 中使用 bool 标志来设置 viewDidLayoutSubviews 中的 contentoffset 仅一次,即使该方法被调用多次。

有没有更优雅的解决方案?

最佳答案

documentation for the topLayoutGuide明确指出:

Query this property within your implementation of the viewDidLayoutSubviews() method.

根据自己的观察,最早获取topLayoutGuide实际长度的点是在viewWillLayoutSubviews()方法中。但是,我不会依赖它,而是按照文档的建议在 viewDidLayoutSubviews() 中进行操作。

无法提前访问该属性的原因...

... 布局指南是依赖于任何容器 View Controller 布局的对象。当需要在屏幕上显示时,这些 View 会延迟布局。因此,当您将 viewController 添加到 navigationViewController 作为其 Root View Controller 时,它还没有布局。

布局发生在您呈现 navigationController 时。那时,两个 View Controller 的 View 都已加载(→ viewDidLoad()viewWillAppear()),然后触发布局传递。首先,navigationViewController 的 View 被布局(布局流程:superview → subview)。导航栏的框架设置为 64 像素的高度。现在可以设置viewControllertopLayoutGuide 了。最后 viewController 的 View 被布局(→ viewWillLayoutSubviews(), viewDidLayoutSubviews())。

结论:

根据布局指南的长度进行一些初始布局调整的唯一方法是您自己建议的方法:

  1. 在您的 View Controller 中有一个您最初设置为 true 的 bool 属性:

    var isInitialLayoutPass: Bool = true 
  2. viewDidLayoutSubviews() 中检查该属性并仅在它为 true 时执行初始布局:

    func viewDidLayoutSubviews() {
    if isInitialLayoutPass {
    tableView.contentOffset = CGPoint(x: 0, y: topLayoutGuide.length)
    }
    }
  3. viewDidAppear() 中,将属性设置为 false 以指示初始布局已完成:

    override func viewDidAppear() {
    super.viewDidAppear()
    isInitialLayoutPass = false
    }

我知道它仍然感觉有点老套,但恐怕这是(我能想到的)唯一的方法,除非你想使用key-value-observing (KVO)在我看来并没有使它变得更整洁。

关于ios - topLayoutGuide 在 vi​​ewWillAppear 之后应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43963559/

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