【问题标题】:How to intercept all view controller viewDidAppear events in the app in one place?如何在一个地方拦截应用程序中的所有视图控制器 viewDidAppear 事件?
【发布时间】:2018-10-09 10:14:02
【问题描述】:

我有一个基于 UITabBarController 的应用,并且在标签栏上方还有一个类似于音乐应用播放器的附加栏。

现在我想自动向所有顶级视图控制器(实际上是所有顶级滚动视图)添加插图,以便我的附加栏永远不会覆盖内容。

一种明显的方法是将所有滚动视图、表格视图等子类化并添加插图。另一种方法是继承 UIViewController 并在整个应用程序的任何地方使用它。在具有数十个视图控制器的现有应用程序中,这些都不是一个好的选择。我也不想使用方法调配。

所以我在想,标签栏控制器可以以某种方式拦截应用程序中的所有视图控制器呈现事件(viewDidAppear?)并相应地调整它们的顶级可滚动视图。

但是,似乎找不到拦截这些事件的简单方法。有任何想法吗?或者任何其他方式可以在任何地方自动注入插图?

【问题讨论】:

  • 您是否尝试创建 uiview 控制器的子类,它是您拥有的所有视图控制器的超类,例如基本视图控制器并覆盖 viewdid 出现方法。
  • @PrashantTukadiya 你真的读过这个问题吗?
  • @mojuba 您可以创建一个带有容器视图的新 UIViewController 并将您的 UITabBarController 嵌入其中。并调整 ContainerView 的约束以合并附加栏
  • 我认为需要更多关于您的结构的详细信息,如果您的 TabBarController 只有子视图控制器(不是导航控制器),它可能会更容易。此外,我认为您不需要更改 viewDidAppear 中的插图(除非您在 viewDidLoad/willAppear 中执行其他操作)。 insets 可以在将控制器添加到标签栏之前设置,它们不受自动布局的影响。
  • @mojuba 是的,我已经阅读了这个问题。但是您要问的是快捷方式,这可能会影响您将来在应用程序中的更新。最好以长而安全的方式获得。我建议你,但不管它是你的电话:)

标签: ios uiviewcontroller nsnotificationcenter


【解决方案1】:

如何在一个地方拦截应用中的所有视图控制器viewDidAppear事件?

除了调动 UIViewController 的 viewDidAppear: 之外,没有其他办法。

或者任何其他方式可以在任何地方自动注入插图?

只需在您的 UITabBarController 上设置 additionalSafeAreaInsets。当附加栏出现或消失(如果有)时,请致电viewSafeAreaInsetsDidChange

【讨论】:

  • 谢谢,这是一个很好的解决方案,但是应该注意它在 iOS11+ 上可用,如果我的标签栏 + 附加栏是半透明的,带有模糊效果,那么我将失去效果。
猜你喜欢
  • 2012-03-12
  • 2011-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-14
  • 2016-05-15
  • 1970-01-01
  • 2014-01-10
相关资源
最近更新 更多