关于UIViewController旋转消息
创建:2011.08.04
补充:2012.10.04
补充:2012年12月29日
2012年12月29日:
这些内容过时了。仅作参考。
*
参考:
Technical Q&A QA1689 Supporting orientations for iPad apps
**对于ipad程序,最好是支持4个方向。如果实在不能支持4个方向,则至少支持上下,或者左右两种方向。
*可以在UIViewController的-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation中返回:
**UIInterfaceOrientationIsPortrait(interfaceOrientation) - if you support only portrait.
**UIInterfaceOrientationIsLandscape(interfaceOrientation) - if you support only landscape.
例如:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return UIInterfaceOrientationIsPortrait(interfaceOrientation);
}
*参考:
Technical Q&A QA1688
Why won't my UIViewController rotate with the device?
1,没有实现shouldAutorotateToInterfaceOrientation。
2,只有第一个加入到UIWindow的view所在的VC,才会收到旋转的消息。[自:亲测。当加入了第二个VC后,仍然是只有第一个VC收到消息,第二个收不到消息,并且View也不能旋转。
更加奇怪的是,如果你先加入一个VC1,然后在加入一个VC2,并把VC2插入到window的最前面,即最底层,则VC2仍然收不到消息,也不会旋转。所以,第一个加入到window的VC就是绝对的能收到消息的VC了。
不过,如果你删除了其他的VC,则VC2就可以正常旋转了。]
当然,你可以把你的另外的VC的view加入到主VC的view中,即作为子view,这样这2个View都会旋转。但是,只有父VC才会收到旋转消息,而子VC则不会收到旋转消息。[自:亲测。]
当然,你可以直接利用NC,TBC,它们都可以保证子VC得到旋转消息。[自:亲测。对于TBC,情况较为简单,无论在哪个子VC,一旦旋转,则都能收到消息。
对于NC,则情况较为复杂。当进入第二层VC后,当旋转时,第一层VC收不到消息,当前层VC才能收到。当退出当前层VC时,如果是横着退出的,则第一层VC会收到2次消息,但是,如果是竖着退出的,则不会收到消息。并且,与之前是横着进入还是竖着进入没有任何关系。不过,VC都能正常显示。]
3,VC过早释放。即,VC的view虽然是第一个加入到UIWindow了,但是,你的VC却过早的释放了。
4,UITabBarController or UINavigationController的所有子VC,没有遵守相同的旋转规则。这会导致其他VC不能收到旋转消息。[自:亲测。当TBC中只要有一个子VC写的不对,则虽然它们都仍然能收到消息,但是却不能旋转。
当NC中,上一层的VC写错时,却不影响界面。但是,当返回上一层时,会导致节目自动旋转到上层VC支持的方向上。总而言之,在NC情况下,如果不一致,则导致的情况比较复杂。]
5,重写-(id)init: or -(id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle后,没有调用super的相应方法。
*补充其他资料
** 关于启动画面,ipad支持4个方向。但是iphone只能支持2个方向。
**
尽量让系统自己旋转。虽然下面介绍的方法可以得到旋转消息,但是需要手动旋转view,这个也是比较费劲的。
**
注册以下两个消息,也也会收到旋转消息。即使,状态栏被隐藏了,它们也会被发送。
UIApplicationWillChangeStatusBarOrientationNotification
UIApplicationDidChangeStatusBarOrientationNotification
**
还有个方法,可以让所有的VC都收到旋转消息。按照如下步骤:
1,在appdelegate的启动之初,调用:
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
该函数可以让设备进行旋转的时候,发出一个Notification:UIDeviceOrientationDidChangeNotification
2,让所有的VC都注册UIDeviceOrientationDidChangeNotification。
并在响应函数中,调用[UIDevice currentDevice].orientation来查看当前的方向。
3,然后根据当前的方向手动旋转,和调整。
3,在delegate退出的时候,调用[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];。
UIDeviceOrientationDidChangeNotification和(UIApplicationWillChangeStatusBarOrientationNotification,UIApplicationDidChangeStatusBarOrientationNotification)的区别在于:
只要设备旋转了,那么UIDeviceOrientationDidChangeNotification是无论如何都会收到的。但是,如果VC自身禁用了旋转的功能,那么当旋转的时候,VC根本不会转,而且status bar也不会转,因此(UIApplicationWillChangeStatusBarOrientationNotification,UIApplicationDidChangeStatusBarOrientationNotification)是都不会收到的。
+++++