ipad,iphone 屏幕旋转支持
最近做ipad项目,遇到不少屏幕转屏发生的错误现象。(其中有些还是自己编码时的疏忽和不规范导致的)
那以下就是总结一些做支持旋转的时候的一些思路和碰到的问题时如何解决的。
首先描述 下工程的大体的一个结构特征。
工程是以UISplitViewController 为依托,然后它的viewControllers分别是 UITabBarController 和 UINavigationController。其中UITabBarController里面的viewControllers又分别是一个个UINavigationController组成。
具体详见图1竖屏
图2横屏
首先这边碰到一个问题是在横屏的时候要是没有对处理UITabBarController进行处理那么会出现在横屏启动程序的时候第一个UINavigationController会向下降低20像素的现象
详见图3
导致这个现象现在暂时的一个处理是在创建UITabBarController的时候先tabBarCtr.selectedIndex = 1;
然后在方法
- (void)viewDidLoad
{
tabBarCtr.selectedIndex = 0;
}
这样就可以暂时解决掉横屏显示异常的现象。(到时候在找到具体解决方法的时候在更新)
以上这边就是程序的大体的一个组成结构,下面进入到我们正式的屏幕旋转的时候是如何支持的。
以下针对的是主ctr 的操作即 UISplitViewController
屏幕旋转其实就是要管理好 1、UIViewController 2、添加在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<[tabBarCtr.viewControllers count]; i++)
{
UINavigationController *navCtr = (UINavigationController *)[tabBarCtr.viewControllers objectAtIndex:i];
NSArray *ctrs = navCtr.viewControllers;
for (int j=0; j<[ctrs count]; j++)
{
//传递旋转的消息到UITabBarController底下的UIViewController
UIViewController *viewCtr = (UIViewController *)[ctrs objectAtIndex:j];
[viewCtr willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
if ([viewCtr.view respondsToSelector:@selector(reloadSubviews)])
{
//对UIViewController进行重新刷新view的位置的操作
//reloadSubviews方法就是在每个ctr类中实现对ctr 上view重新布局的操作
[viewCtr.view performSelector:@selector(reloadSubviews)];
}
}
[navCtr willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
}
//以上这种方式就已经对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);
[tableView reloadData];
}
/
************************************************************
ipad旋转的时候如果在横屏的时候对UIViewController 进行push多层的时候出现异常(push后退出的动作本来是从右向左的展示,但是怪象就是退出的时候变成
从上到下的操作)
其实这个时候要去检查下你push的UIViewController 中对shouldAutorotateToInterfaceOrientation设置是否为与上层的ctr方法返回一致
如上层返回
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return YES;
}
那么你这边也应当是YES
*************************************************************
ipad,iphone 屏幕旋转支持
最近做ipad项目,遇到不少屏幕转屏发生的错误现象。(其中有些还是自己编码时的疏忽和不规范导致的)
那以下就是总结一些做支持旋转的时候的一些思路和碰到的问题时如何解决的。
首先描述 下工程的大体的一个结构特征。
工程是以UISplitViewController 为依托,然后它的viewControllers分别是 UITabBarController 和 UINavigationController。其中UITabBarController里面的viewControllers又分别是一个个UINavigationController组成。
具体详见图1竖屏
图2横屏
首先这边碰到一个问题是在横屏的时候要是没有对处理UITabBarController进行处理那么会出现在横屏启动程序的时候第一个UINavigationController会向下降低20像素的现象
详见图3
导致这个现象现在暂时的一个处理是在创建UITabBarController的时候先tabBarCtr.selectedIndex = 1;
然后在方法
- (void)viewDidLoad
{
tabBarCtr.selectedIndex = 0;
}
这样就可以暂时解决掉横屏显示异常的现象。(到时候在找到具体解决方法的时候在更新)
以上这边就是程序的大体的一个组成结构,下面进入到我们正式的屏幕旋转的时候是如何支持的。
以下针对的是主ctr 的操作即 UISplitViewController
屏幕旋转其实就是要管理好 1、UIViewController 2、添加在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<[tabBarCtr.viewControllers count]; i++)
{
UINavigationController *navCtr = (UINavigationController *)[tabBarCtr.viewControllers objectAtIndex:i];
NSArray *ctrs = navCtr.viewControllers;
for (int j=0; j<[ctrs count]; j++)
{
//传递旋转的消息到UITabBarController底下的UIViewController
UIViewController *viewCtr = (UIViewController *)[ctrs objectAtIndex:j];
[viewCtr willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
if ([viewCtr.view respondsToSelector:@selector(reloadSubviews)])
{
//对UIViewController进行重新刷新view的位置的操作
//reloadSubviews方法就是在每个ctr类中实现对ctr 上view重新布局的操作
[viewCtr.view performSelector:@selector(reloadSubviews)];
}
}
[navCtr willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
}
//以上这种方式就已经对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);
[tableView reloadData];
}
/
************************************************************
ipad旋转的时候如果在横屏的时候对UIViewController 进行push多层的时候出现异常(push后退出的动作本来是从右向左的展示,但是怪象就是退出的时候变成
从上到下的操作)
其实这个时候要去检查下你push的UIViewController 中对shouldAutorotateToInterfaceOrientation设置是否为与上层的ctr方法返回一致
如上层返回
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return YES;
}
那么你这边也应当是YES
*************************************************************