iOS-部分页面横屏功能

近期公司项目需要部分页面功能,找了找方法,也没找到合适的,最后自己瞎研究出来。

6B801210-E4D2-47E6-88CF-7496DE64D4BD.jpg

说一下需要做法吧:我采用的是UINavigationController push方式

先了解下系统处理旋转的流程:

首先让我们来看看系统在程序的启动过程UIKit处理屏幕旋转的流程

当加速计检测到方向变化的时候,会发出 UIDeviceOrientationDidChangeNotification 通知,这样任何关心方向变化的view都可以通过注册该通知,在设备方向变化的时候做出相应的响应。
UIKit帮助我们做了很多事情,方便我们完成屏幕旋转。UIKit的相应屏幕旋转的流程如下:
1、设备旋转的时候,UIKit接收到旋转事件。
2、UIKit通过AppDelegate通知当前程序的window。
3、Window会知会它的rootViewController,判断该view controller所支持的旋转方向,完成旋转。
4、如果存在弹出的view controller的话,系统则会根据弹出的view controller,来判断是否要进行旋转。

最基本的是打开左右旋转功能,即使你代码添加旋转,不打开会蹦的

image.png

在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一下,你会发现,其他页面不会旋转,需要旋转的页面可以旋转了。

64F465A8-80A2-4E65-9A87-13C0D721E412.jpg

补充一个旋转时的方法:

- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    if (UIInterfaceOrientationIsPortrait(toInterfaceOrientation)) {
        //如果当前是竖屏要完成的事情
    }else {
        //其他情况完成事情
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容