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

问题描述 投票:21回答:3

我试图了解当viewUITabBarControllerUINavigationController关联的UIViewController如何在切换呼叫状态栏时作出反应。 我的麻烦是它们看起来表现不同,这会引起我的副作用。

我做了一个项目,改变了上面3种类型的窗口的根视图控制器,我转储了descriptionview以获得框架坐标。


  • UIViewController

inCall状态OFF:

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

我理解这一点:当出现在通话状态栏时,UIViewController视图的高度收缩并且松开20,其y坐标从20移动到40。

那很完美 !当用UIViewControllerUITabBarController取代经典的UINavigationController时我会期待同样的情况但事实并非如此!


  • UINavigationController

InCall状态栏OFF

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

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


  • UITabBarController

关闭

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

UINavigationController相同:当切换incall状态栏时,viewUITabBarController似乎没有受到影响。


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

iphone uitabbarcontroller statusbar in-call
3个回答
17
投票

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

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

这两个属性,

UIViewAutoresizingFlexibleTopMargin
UIViewAutoresizingFlexibleHeight  

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


4
投票

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

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

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


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.