我正在尝试了解与view
,UITabBarController
或UINavigationController
关联的UIViewController
在切换通话中状态栏时的反应。
我的麻烦在于它们的行为似乎不同,这会引起我的副作用。
我创建了一个项目,用于更改上述3种类型的窗口的根视图控制器,并转储description
的{{1}}以获取帧坐标。
view
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.
那是完美的!在用UIViewController
或UIViewController
替换经典UITabBarController
时我会期望同样的情况,但事实并非如此!
UINavigationController
InCall状态栏关闭
UILayoutContainerView: 0x4b35ab0; frame = (0 0; 320 480); autoresize = W+H; ..的打开
UILayoutContainerView: 0x4e1b060; frame = (0 0; 320 480); autoresize = W+H; ..
在这种情况下,当切换通话中状态栏时,UINavigationController处理的视图没有更改其帧属性?! (为什么?:()
UINavigationController
的关闭
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状态显示作出反应,我的反应也没有: (
答案 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)
理想情况下,您应该忘记视图调整大小的数量并使用自动调整大小的掩码。