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

时间:2011-01-25 16:44:36

标签: iphone ios uiviewcontroller uinavigationcontroller

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

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

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

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

Cmd-shift-3 rapid-fire FTW

我已尝试在其viewWillDisappear:animated:方法中更新A的帧,但它确实很奇怪,因为它似乎是在UINavigationController推送动画块中调用的。任何见解都将不胜感激。

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

2 个答案:

答案 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];