iOS屏幕旋转各类集锦(一)-单页旋转

如果你需要开启旋转
首先你需要开启旋转在info.plist点选(需要使用方向)

  • Portrait
  • Landscape Left
  • Landscape Right

或者在AppDelegate中实现代理方法

- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
return UIInterfaceOrientationMaskPortraitUpsideDown;
}

系统提供的样式:无非是各种搭配一下和plist里的一样

typedef NS_OPTIONS(NSUInteger, UIInterfaceOrientationMask) {
UIInterfaceOrientationMaskPortrait = (1 <<     UIInterfaceOrientationPortrait),
UIInterfaceOrientationMaskLandscapeLeft = (1 << UIInterfaceOrientationLandscapeLeft),
UIInterfaceOrientationMaskLandscapeRight = (1 << UIInterfaceOrientationLandscapeRight),
UIInterfaceOrientationMaskPortraitUpsideDown = (1 << UIInterfaceOrientationPortraitUpsideDown),
UIInterfaceOrientationMaskLandscape = (UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight),
UIInterfaceOrientationMaskAll = (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortraitUpsideDown),
UIInterfaceOrientationMaskAllButUpsideDown = (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight),
}
  • 首先让我们来看看系统在程序的启动过程UIKit处理屏幕旋转的流程 
      当加速计检测到方向变化的时候,会发出 UIDeviceOrientationDidChangeNotification 通知,这样任何关心方向变化的view都可以通过注册该通知,在设备方向变化的时候做出相应的响应。UIKit帮助我们做了很多事情,方便我们完成屏幕旋转。UIKit的相应屏幕旋转的流程如下:
    1、设备旋转的时候,UIKit接收到旋转事件。
    2、UIKit通过AppDelegate通知当前程序的window。
    3、Window会知会它的rootViewController,判断该view controller所支持的旋转方向,完成旋转。
    4、如果存在弹出的view controller的话,系统则会根据弹出的view controller,来判断是否要进行旋转。

看了这么久你会发现,道理我都懂但是咋使用呢?

****NAV PushViewController 单独设置某页****

注 : 使用UINavigationController 父类实现不然子VC无效(原因就是在有UINavigationController的情况下rootViewController是UINavigationController)

父类实现方法,就可以让某个单独的VC获得效果:

- (BOOL)shouldAutorotate  
{ 
 //也可以用topViewController判断VC是否需要旋转
return self.topViewController.shouldAutorotate;  
}  

- (NSUInteger)supportedInterfaceOrientations  
{   
    //也可以用topViewController判断VC支持的方向
    return self.topViewController.supportedInterfaceOrientations;  
}

****Tabbat PushViewController 单独设置某页****

- (BOOL)shouldAutorotate {
 return [self.selectedViewController shouldAutorotate];
}
- (NSUInteger)supportedInterfaceOrientations {
 return [self.selectedViewController supportedInterfaceOrientations];
}

tabbr+nav 需要同时设置才能生效

子类实现方法

-(UIInterfaceOrientationMask)supportedInterfaceOrientations
{
    //当前支持的旋转类型
    return UIInterfaceOrientationMaskAllButUpsideDown;
}

- (BOOL)shouldAutorotate
{
    // 是否支持旋转
    return YES;
}

-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    // 默认进去类型
  return   UIInterfaceOrientationPortrait;
}

PresentViewController 单独设置某页

-(UIInterfaceOrientationMask)supportedInterfaceOrientations
{
    // 是否支持旋转
    return UIInterfaceOrientationMaskAllButUpsideDown;
}

-(BOOL)shouldAutorotate
{
    // 是否支持旋转
    return YES;
}

iOS屏幕旋转各类集锦(二)-单页部分旋转
***写的比较粗糙demo附上https://github.com/bloodspasm/ScreenRotation ***

你可能感兴趣的:(iOS屏幕旋转各类集锦(一)-单页旋转)