佳为好友

原:关于UIViewController旋转消息 --2012年12月29日

关于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)是都不会到的。

+++++

posted on 2012-12-29 10:44 佳为好友 阅读(472) 评论(0)  编辑 收藏 引用 所属分类: 非UI


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2012年12月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

留言簿(1)

随笔分类

搜索

最新评论

评论排行榜