2011-01-25 84 views
4

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

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

这也发生在相反的方向上:当从B过渡到A (通过后退按钮),我想要工具栏进行动画显示以再次显示A的toolbarItems,但由于A的视图不会延伸到屏幕的底部,因此在弹出过渡期间可以看到UIWindow

这也许不是一直是最好的说明,所以这里是截图:

Cmd-shift-3 rapid-fire FTW

我曾尝试更新的框架在其viewWillDisappear:animated:方法,但它确实奇怪的事情,因为它好像是叫在UINavigationController推动动画块内。任何洞察力将不胜感激。

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

回答

0

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

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

也许最好的做法是在B的viewDidAppear中拨打setToolbarHidden:animated:

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

+0

我只是想动`setToolbarHidden:动画:`到B的`viewDidAppear :动画:`。它在转发过程中成功地覆盖了'UIWindow`背景,但我不喜欢在解散工具栏之前等待推送完成。由于B没有`toolbarItems`,因此A的项目向左过渡,在工具栏被取消之前留空。 – 2011-01-25 19:02:34