呈现 UINavigationController 时调用什么方法?

What method is called when UINavigationController is presented?

我正在尝试对 UINavigationController 进行子类化以在其 UINavigationBar 下添加自定义子视图。问题是当我将自定义 UINavigationController 设置为 windowrootViewController 时,UINavigationBar 位置发生变化,因此我想相应地更新自定义视图的位置。我的问题是我应该把我的代码放在哪里来更新我的自定义视图。

    var navController = TabbedNavigationController(rootViewController: firstView)

    // navController.navigationBar.frame.origin.y = 0
    self.window?.rootViewController = navController
    self.window?.makeKeyAndVisible()
    // navController.navigationBar.frame.origin.y = 20.0

您要做的是响应导航控制器视图的子视图的定位。子视图的定位称为 layout,发生在 layoutSubviews 中。因此,您可以尝试实现 viewDidLayoutSubviews,它会在 layoutSubviews 之后立即调用。请注意,它可以被调用多次,但您可能只想添加一次子视图,因此请注意添加适当的守卫。

您可以强制 ViewController 的 "view" 延伸到 UINavigationBar 下方。这里有一些代码可以帮助您解决问题,它不是 Swift,它是 ObjC,但您会明白要点的。这是来自我的 UIVeiwController 子类的自定义实现。我还有 UINavigationController 和 UINavigationBar 的完整实现,以调整 UINavigationBar 的大小。我可以告诉您,只需按照我在此处链接的代码,您就可以完成 Apple 在他们的示例中所做的事情。

[[[self navigationController] navigationBar] setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
[[[self navigationController] navigationBar] setShadowImage:[UIImage new]];
[[[self navigationController] navigationBar] setTranslucent:TRUE];
[[[[self navigationController] navigationBar] layer] setShadowOpacity:0.0f];
[[[[self navigationController] navigationBar] layer] setShadowOffset:CGSizeMake(0.0f, 0.0f)];