In-Call状态栏如何影响UIViewController的视图大小?

时间:2011-03-30 12:50:11

标签: iphone uitabbarcontroller statusbar in-call

我正在尝试了解与viewUITabBarControllerUINavigationController关联的UIViewController在切换通话中状态栏时的反应。
我的麻烦在于它们的行为似乎不同,这会引起我的副作用。

我创建了一个项目,用于更改上述3种类型的窗口的根视图控制器,并转储description的{​​{1}}以获取帧坐标。


  • view

enter image description here

inCall状态关闭

UIView: 0x4e2a1f0; frame = (0 20; 320 460); autoresize = W+H; ....
打开
UIView: 0x4e2a1f0; frame = (0 40; 320 440); autoresize = W+H; ...

我理解这一点:当看到呼叫状态栏时,UIViewController视图的高度收缩并且松散20,其y坐标从20移动到40.

那是完美的!在用UIViewControllerUIViewController替换经典UITabBarController时我会期望同样的情况,但事实并非如此!


  • UINavigationController

    enter image description here

InCall状态栏关闭

UILayoutContainerView: 0x4b35ab0; frame = (0 0; 320 480); autoresize = W+H; ..
打开
UILayoutContainerView: 0x4e1b060; frame = (0 0; 320 480); autoresize = W+H; ..

在这种情况下,当切换通话中状态栏时,UINavigationController处理的视图没有更改其帧属性?! (为什么?:()


  • UINavigationController

enter image description here关闭

UIView: 0x4b2f6a0; frame = (0 20; 320 460); autoresize = W+H; ...
打开
UIView: 0x4b2f6a0; frame = (0 20; 320 460); autoresize = W+H; ...

UITabBarController相同:当切换incall状态栏时,UINavigationController的{​​{1}}似乎没有受到影响。


有人可以解释一下,当显示incall状态栏时,此调整大小是如何工作的吗? 我的最终目标是显示view,显示 ABOVE 整个UITabBarController,并在显示通话状态时正确调整大小。但是,我真的不知道在视图层次结构中放置这样的视图的位置:如果我将它添加为UITabBarController视图的子视图,因为这个视图没有对incall状态显示作出反应,我的反应也没有: (

3 个答案:

答案 0 :(得分:17)

切换通话中状态栏时视图的高度取决于它的锚定方式。

使用UIView的autoResizingMask来控制视图在调用状态栏显示时是向下移动还是调整大小。

这两个属性,

UIViewAutoresizingFlexibleTopMargin
UIViewAutoresizingFlexibleHeight  

会帮助你。第一个向下推视图,第二个改变大小。

答案 1 :(得分:4)

您的常规UIViewController示例将[wantsFullScreenLayout]设置为NO,这会导致视图自动调整大小,因此不会进入状态栏。

另一方面,

UINavigationController和UITabBarController默认wantsFullScreenLayout为YES。所以他们的观点占据了整个窗口,他们调整子视图的大小和位置以适当地处理状态栏。如果你明确地将这些控制器上的属性设置为NO,你应该得到你想要的行为(但是如果你关心的话,那么将失去正确处理将wantsFullScreenLayout设置为YES的子控制器的能力。) p>

在您的UITabBarController示例BTW中,您似乎没有打印标签栏控制器视图的信息;这是一个UILayoutContainerView,而不是简单的UIView。

答案 2 :(得分:1)

理想情况下,您应该忘记视图调整大小的数量并使用自动调整大小的掩码。