通话状态栏如何影响UIViewController的视图大小?

21

我正在尝试理解UITabBarControllerUINavigationControllerUIViewController关联的view在切换呼叫状态栏时的反应。

我的问题是它们似乎表现不同,这给我带来了副作用。

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


  • UIViewController

enter image description here

呼叫状态关闭

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。

太棒了!我期望在将经典的UIViewController替换为UITabBarControllerUINavigationController时会有相同的结果,但事实并非如此!


  • UINavigationController

    enter image description here

呼叫状态栏关闭

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

在这种情况下,当呼叫状态栏切换时,由UINavigationController处理的视图不会更改其frame属性?!(为什么?:()
  • UITabBarController

enter image description here 关闭时

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

UINavigationController中的情况相同:当切换到incall状态栏时,UITabBarControllerview似乎不会受到影响。

有人能解释一下当显示incall状态栏时,如何进行此调整大小?
我的最终目标是显示一个在整个UITabBarController上面显示的UIView,并且在显示呼叫状态时可以正确调整大小。 但是,我真的不知道在视图层次结构中放置这样的视图:如果将其添加为UITabBarController的子级,则此视图不会响应incall状态显示,我的也不会响应:(

3个回答

17

当电话通话状态栏被切换时,视图的高度取决于其锚定方式。

通过调整UIView的autoResizingMask属性来控制视图在电话通话状态栏显示时是移动下去还是改变大小。

这两个属性,

UIViewAutoresizingFlexibleTopMargin
UIViewAutoresizingFlexibleHeight  

以下内容会对您有所帮助。第一个会将视图向下推,第二个则改变大小。


4
您的常规UIViewController示例将[wantsFullScreenLayout]设置为NO,这会自动调整视图大小,以便不会覆盖状态栏。
另一方面,UINavigationController和UITabBarController默认将wantsFullScreenLayout设置为YES。因此,它们的视图占据整个窗口,并且它们自己调整子视图的大小和位置,以适当处理状态栏。如果您在这些控制器上明确设置属性为NO,则应获得所需的行为(但是,如果您关心设置wantsFullScreenLayout为YES的子控制器的正确处理能力,则会失去该功能)。
顺便说一句,在您的UITabBarController示例中,似乎您没有打印选项卡栏控制器的视图信息;这里是一个UILayoutContainerView,而不是普通的UIView。

嗯,非常有趣的评论,我会试试你的提示!非常感谢。 - yonel

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接