我正在使用UINavigationController
工具栏。在我显示它之前,我调整了视图的大小,以便它们不被工具栏阻挡(我将当前视图控制器视图的框架设置为从navigationBar
底部到顶部的矩形。 toolbar
。
但并非所有视图控制器都有toolbarItems
。因此,当从具有项目(控制器A)的视图控制器切换到不具有项目(控制器B)的视图控制器时,我想隐藏工具栏。但是,当我在B的setToolbarHidden:animated:
方法中调用viewWillAppear:animated:
时,工具栏会在推送过渡期间向下设置动画并显示其背后的UIWindow
背景。
这也发生在相反的方向:当从B转换到A(通过后退按钮)时,我想让工具栏动画再次显示A的toolbarItems
,但由于A的视图没有延伸到在屏幕底部,弹出过渡期间UIWindow
可见。
这可能不是最好的描述,所以这是一个截图:
我已尝试在其viewWillDisappear:animated:
方法中更新A的帧,但它确实很奇怪,因为它似乎是在UINavigationController
推送动画块中调用的。任何见解都将不胜感激。
更新:我尝试将工具栏隐藏在B viewDidAppear:animated:
中,但结果并不理想。使用此解决方案,在推送转换完成之前,工具栏不会被解除。由于B没有任何toolbarItems
,因此在过渡期间A的项目会被推到左侧,在屏幕消失之前会在屏幕上留下一个空工具栏。此外,当返回A时,UIWindow
背景将可见,除非我将工具栏设置为在B viewWillDisappear:animated:
中可见,这意味着B必须知道A有toolbarItems
。
答案 0 :(得分:0)
也许最佳做法是在B setToolbarHidden:animated:
中拨打viewDidAppear
?
或者您可以在自定义pushViewController:animated:
子类中的UINavigationController
方法中将B推送到导航控制器之前更改A的帧。
答案 1 :(得分:0)
由于我从来没有找到一个令人满意的解决方案涉及动画,我最终使我的视图延伸到工具栏后面,以避免显示窗口。如果你的控制器的视图是UITableView或UIScrollView,你可以适当地设置它的contentInset
,这样你的内容就不会被工具栏掩盖:
UIEdgeInsets edgeInsets = [[self tableView] contentInset];
if (![[self navigationController] isToolbarHidden]) {
edgeInsets.bottom = CGRectGetHeight([[[self navigationController] toolbar] frame]);
}
[[self tableView] setContentInset:edgeInsets];