使用 UINavigationController setToolbarHidden:animated 时如何调整视图大小:

Posted

技术标签:

【中文标题】使用 UINavigationController setToolbarHidden:animated 时如何调整视图大小:【英文标题】:How to resize view when using UINavigationController setToolbarHidden:animated: 【发布时间】:2011-01-25 16:44:35 【问题描述】:

我正在使用UINavigationController 工具栏。在显示它之前,我调整了我的视图大小,以便它们不会被工具栏阻挡(我将当前视图控制器视图的框架设置为从navigationBar 底部到@987654324 顶部的矩形@。

但并不是我所有的视图控制器都有toolbarItems。因此,当从具有项目(控制器 A)的视图控制器切换到没有项目(控制器 B)的视图控制器时,我想隐藏工具栏。但是,当我在 B 的 viewWillAppear:animated: 方法中调用 setToolbarHidden:animated: 时,工具栏会在推送过渡期间向下动画,并在其后面显示 UIWindow 背景。

这也发生在相反的方向:当从 B 过渡到 A 时(通过后退按钮),我希望工具栏以动画形式再次显示 A 的 toolbarItems,但由于 A 的视图没有延伸到底部在屏幕上,UIWindow 在弹出过渡期间可见。

这可能不是最好的描述,所以这里是一个屏幕截图:

我尝试在其viewWillDisappear:animated: 方法中更新A 的框架,但它做了一些奇怪的事情,因为它似乎是在UINavigationController push 动画块中调用的。任何见解将不胜感激。

更新:我尝试将工具栏隐藏在 B 的 viewDidAppear:animated: 中,但结果并不理想。使用此解决方案,在推送转换完成之前,工具栏不会被关闭。由于 B 没有任何toolbarItems,因此 A 的项目在转换期间被推到左侧,在它消失之前在屏幕上留下一个空的工具栏。此外,当返回 A 时,UIWindow 背景将可见,除非我将工具栏设置为在 B 的 viewWillDisappear:animated: 中可见,这意味着 B 必须知道 A 具有 toolbarItems

【问题讨论】:

【参考方案1】:

也许最好的做法是在 B 的 viewDidAppear 中调用 setToolbarHidden:animated:

或者您可以在自定义 UINavigationController 子类中的 pushViewController:animated: 方法中将 B 推送到导航控制器之前更改 A 的框架。

【讨论】:

我刚刚尝试将setToolbarHidden:animated: 移动到B 的viewDidAppear:animated:。它在向前转换期间成功地掩盖了UIWindow 背景,但我不喜欢它在关闭工具栏之前等待推送完成的方式。由于 B 没有 toolbarItems,因此 A 的项目向左转换,在它被关闭之前将工具栏留空。 至于UINavigationController 子类建议,那就是Apple doesn't want people doing。 Apple 文档现在说,“此类通常按原样使用,但在 ios 6 及更高版本中可能是子类。”【参考方案2】:

因为我从来没有找到一个令人满意的解决方案来解决这个涉及动画的问题,所以我最终让我的视图向下延伸到工具栏后面以避免显示窗口。如果你的控制器视图是 UITableView 或 UIScrollView,你可以适当地设置它的contentInset,这样你的内容就不会被工具栏覆盖:

UIEdgeInsets edgeInsets = [[self tableView] contentInset];
if (![[self navigationController] isToolbarHidden]) 
    edgeInsets.bottom = CGRectGetHeight([[[self navigationController] toolbar] frame]);

[[self tableView] setContentInset:edgeInsets];

【讨论】:

以上是关于使用 UINavigationController setToolbarHidden:animated 时如何调整视图大小:的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationcontroller 中未使用的视图会发生啥?

使用 push segue 时 UINavigationController 是不是强制

UINavigationController - 使用 UIBlurEffect 清除背景

一起使用 UITabBarController 和 UINavigationController

iPhone - UINavigationController - 使用 CATransaction 自定义动画

如何在 SwiftUI 中使用 UINavigationController