我试图了解当view
,UITabBarController
或UINavigationController
关联的UIViewController
如何在切换呼叫状态栏时作出反应。
我的麻烦是它们看起来表现不同,这会引起我的副作用。
我做了一个项目,改变了上面3种类型的窗口的根视图控制器,我转储了description
的view
以获得框架坐标。
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。
那很完美 !当用UIViewController
或UITabBarController
取代经典的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状态栏时,view
的UITabBarController
似乎没有受到影响。
有人可以解释一下,当显示incall状态栏时,此调整大小是如何工作的吗?
我的最终目标是显示一个UIView
,显示在整个UITabBarController
上方,并在显示通话状态时正确调整大小。但是,我真的不知道在视图层次结构中放置这样的视图的位置:如果我将它添加为UITabBarController视图的子视图,因为这个视图没有对incall状态显示作出反应,我的反应也没有: (
切换通话中状态栏时视图的高度取决于其锚定方式。
使用UIView的autoResizingMask来控制在调用状态栏显示时视图是向下移动还是调整大小。
这两个属性,
UIViewAutoresizingFlexibleTopMargin
UIViewAutoresizingFlexibleHeight
会帮助你。第一个推动视图,第二个改变大小。
您的常规UIViewController示例将[wantsFullScreenLayout
]设置为NO,这会导致视图自动调整大小,使其不会进入状态栏。
另一方面,UINavigationController和UITabBarController默认wantsFullScreenLayout
为YES。所以他们的观点占据了整个窗口,他们调整子视图的大小和位置以适当地处理状态栏。如果你明确地将这些控制器上的属性设置为NO,你应该得到你想要的行为(但是如果你关心的话,那么将失去正确处理将wantsFullScreenLayout
设置为YES的子控制器的能力)。
在您的UITabBarController示例BTW中,您似乎没有打印标签栏控制器视图的信息;这是一个UILayoutContainerView,而不是一个简单的UIView。
理想情况下,您应该忘记视图调整大小的数量并使用自动调整大小的掩码。