近期公司项目需要部分页面功能,找了找方法,也没找到合适的,最后自己瞎研究出来。
说一下需要做法吧:我采用的是UINavigationController push方式
先了解下系统处理旋转的流程:
首先让我们来看看系统在程序的启动过程UIKit处理屏幕旋转的流程
当加速计检测到方向变化的时候,会发出 UIDeviceOrientationDidChangeNotification 通知,这样任何关心方向变化的view都可以通过注册该通知,在设备方向变化的时候做出相应的响应。
UIKit帮助我们做了很多事情,方便我们完成屏幕旋转。UIKit的相应屏幕旋转的流程如下:
1、设备旋转的时候,UIKit接收到旋转事件。
2、UIKit通过AppDelegate通知当前程序的window。
3、Window会知会它的rootViewController,判断该view controller所支持的旋转方向,完成旋转。
4、如果存在弹出的view controller的话,系统则会根据弹出的view controller,来判断是否要进行旋转。
最基本的是打开左右旋转功能,即使你代码添加旋转,不打开会蹦的
在UINavigationController里修改(子类vc无效)
- (BOOL)shouldAutorotate
{
//每次旋转时候去topViewController询问VC是否需要旋转
return self.topViewController.shouldAutorotate;
}
- (NSUInteger)supportedInterfaceOrientations
{
//每次旋转时候去topViewController询问VC支持的方向
return self.topViewController.supportedInterfaceOrientations;
}
之后run一下,所有页面都能横屏了,但是需求是某些页面旋转,其他用不着,最好的做法就是声明一个基类,手动设置关闭旋转,在需要旋转的子类了打开就行了(我是这样做的)
基类设置:
-(UIInterfaceOrientationMask)supportedInterfaceOrientations
{
//当前支持的旋转类型
return UIInterfaceOrientationMaskAllButUpsideDown;
}
- (BOOL)shouldAutorotate
{
// 是否支持旋转
return NO;
}
-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
// 默认进去类型
return UIInterfaceOrientationPortrait;
}
之后在需要旋转的子类设置shouldAutorotate为YES就ok了。
run一下,你会发现,其他页面不会旋转,需要旋转的页面可以旋转了。
补充一个旋转时的方法:
- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
if (UIInterfaceOrientationIsPortrait(toInterfaceOrientation)) {
//如果当前是竖屏要完成的事情
}else {
//其他情况完成事情
}
}