21

我试图了解view关联到 aUITabBarController或在通话状态栏被切换时的反应UINavigationController。 我的麻烦是他们的行为似乎不同,这给我带来了副作用。UIViewController

我制作了一个项目,更改了上述 3 种类型的窗口的根视图控制器,然后我转储了descriptionview获取框架坐标。


  • UIViewController

在此处输入图像描述

通话状态关闭

UIView: 0x4e2a1f0; 帧 = (0 20; 320 460); 自动调整大小 = W+H;……
UIView: 0x4e2a1f0; 帧 = (0 40; 320 440); 自动调整大小 = W+H;...

这一点我的理解:当通话状态栏出现时,UIViewController 的视图高度缩小并失去 20,它的 y 坐标从 20 移动到 40。

那很完美 !UIViewController当用aUITabBarController或 a替换经典时,我会期望相同,UINavigationController但事实并非如此!


  • UINavigationController

    在此处输入图像描述

InCall 状态栏关闭

UILayoutContainerView: 0x4b35ab0; 帧 = (0 0; 320 480); 自动调整大小 = W+H;..
UILayoutContainerView: 0x4e1b060; 帧 = (0 0; 320 480); 自动调整大小 = W+H;..

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


  • UITabBarController

在此处输入图像描述 离开

UIView:0x4b2f6a0;帧 = (0 20; 320 460); 自动调整大小 = W+H;...
UIView:0x4b2f6a0;帧 = (0 20; 320 460); 自动调整大小 = W+H;...

与中相同UINavigationController:切换调用状态栏时viewUITabBarController似乎没有受到影响。


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

4

3 回答 3

17

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

使用 UIView 的 autoResizingMask 来控制在通话状态栏出现时视图是否应该向下移动或调整大小。

这两个属性,

UIViewAutoresizingFlexibleTopMargin
UIViewAutoresizingFlexibleHeight  

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

于 2011-07-01T07:11:27.187 回答
4

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

另一方面,UINavigationController 和 UITabBarController 默认wantsFullScreenLayout为 YES。所以他们的视图占据了整个窗口,他们自己调整子视图的大小和位置以适当地处理状态栏。wantsFullScreenLayout如果您将这些控制器上的属性显式设置为 NO,您应该得到您想要的行为(但如果您关心的话,将失去正确处理设置为 YES 的子控制器的能力)。

在您的 UITabBarController 示例中,顺便说一句,您似乎没有打印标签栏控制器视图的信息;这里是 UILayoutContainerView,而不是普通的 UIView。

于 2011-07-01T13:46:09.790 回答
1

理想情况下,您应该忘记视图调整了多少大小并使用 Autoresizing 蒙版进行调整。

于 2011-07-04T07:27:55.357 回答