李程站 发表于 2013-2-4 02:28:19

iPad 和 iPhone 屏幕旋转支持 图文详解

iPad 和 iPhone 屏幕旋转支持 图文详解是本文要介绍的内容。最近做ipad项目,遇到不少屏幕转屏发生的错误现象。(其中有些还是自己编码时的疏忽和不规范导致的)
那以下就是总结一些做支持旋转的时候的一些思路和碰到的问题时如何解决的。
首先描述 下工程的大体的一个结构特征。
工程是以UISplitViewController 为依托,然后它的viewControllers分别是    UITabBarController 和 UINavigationController。其中UITabBarController里面的viewControllers又分别是一个个UINavigationController组成。
http://images.51cto.com/files/uploadimg/20110707/1125370.png
具体详见图1竖屏
http://images.51cto.com/files/uploadimg/20110707/1125371.png
图2横屏
首先这边碰到一个问题是在横屏的时候要是没有对处理UITabBarController进行处理那么会出现在横屏启动程序的时候第一个UINavigationController会向下降低20像素的现象
http://images.51cto.com/files/uploadimg/20110707/1125372.png
详见图3
导致这个现象现在暂时的一个处理是在创建UITabBarController的时候先tabBarCtr.selectedIndex = 1;
然后在方法

[*](void)viewDidLoad
[*]
[*]tabBarCtr.selectedIndex = 0;
这样就可以暂时解决掉横屏显示异常的现象。(到时候在找到具体解决方法的时候在更新)
以上这边就是程序的大体的一个组成结构,下面进入到我们正式的屏幕旋转的时候是如何支持的。
以下针对的是主ctr 的操作即 UISplitViewController
屏幕旋转其实就是要管理好 1、UIViewController2、添加在UIViewController上的view或者单独的一些view的处理控制。
首先对应UIViewController它里面提供了很多旋转时候的一些代理和方法。
1、设置支持自动适应横竖屏

[*](BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation   
[*]{
[*] return YES;
[*]}
2、在屏幕快要发生改变的时候进行处理

[*](void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
[*]{
[*]//其实我们在这边要做的就是传递旋转消息和对view做相应的改变
[*]   for (int i=0; i<; i++)
[*]   {
[*] UINavigationController *navCtr = (UINavigationController *);
[*] NSArray *ctrs = navCtr.viewControllers;
[*] for (int j=0; j<; j++)   
[*] {
[*]//传递旋转的消息到UITabBarController底下的UIViewController   
[*]UIViewController *viewCtr = (UIViewController *);
[*];
[*]if ()
[*]{
[*]   //对UIViewController进行重新刷新view的位置的操作
[*]   //reloadSubviews方法就是在每个ctr类中实现对ctr 上view重新布局的操作
[*]   ;   
[*]}
[*] }
[*];
[*]    }
[*] //以上这种方式就已经对UIViewController和其上的view进行了旋转的相应操作
[*] //个人觉得当然这里也可以用通知进行消息的传递
[*]}
在某个ctr中 的 reloadSubviews方法样例

[*](void)reloadSubviews
[*]{
[*] CGRect frame =getScreenRect();//用来获取当前旋转后屏幕的大小frame就是为刷新提供大小
[*] AA.frame = CGRectMake(frame.size.width-140, 104, 120, 40);
[*] BB.frame = CGRectMake(frame.size.width-140, 44, 120, 40);   
[*] Ctr.view.frame = CGRectMake(0, 200, frame.size.width, frame.size.height-200);
[*] ;
[*]}
ipad旋转的时候如果在横屏的时候对UIViewController 进行push多层的时候出现异常(push后退出的动作本来是从右向左的展示,但是怪象就是退出的时候变成从上到下的操作)
其实这个时候要去检查下你push的UIViewController 中对shouldAutorotateToInterfaceOrientation设置是否为与上层的ctr方法返回一致
如上层返回

[*](BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation   
[*]{
[*] return YES;
[*]}
那么你这边也应当是YES
小结:关于iPad 和 iPhone 屏幕旋转支持 图文详解的内容介绍完了希望本文对你有所帮助!
【编辑推荐】

[*]iPhone开发基础学习 在程序里设置Push
[*]iPad与iPhone 开发区别详解
[*]iPhone动态加载图片 实例讲解
[*]关于iPhone开发SDK详细介绍
[*]详解iPhone开发工具Xcode使用
[*]iPhone开发 iPhone SDK工具Xcode
页: [1]
查看完整版本: iPad 和 iPhone 屏幕旋转支持 图文详解