美文网首页iOSiOS技术专题iOS开发
iOS屏幕旋转各类集锦(一)-单页旋转

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

作者: 小布走慢点 | 来源:发表于2016-03-17 15:41 被阅读958次

如果你需要开启旋转
首先你需要开启旋转在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 ***

相关文章

网友评论

  • 非夜:这种方式并不好用,如果你查阅文档(shouldAutorotate),你会发现这样一句话"YES if the content should rotate, otherwise NO. This method returns YES by default."也就是任何一个UIViewController的shouldAutorotate默认返回的都是YES,这样就会导致如果在MainViewController和RootViewControllor之间再加入N个VC,这N个VC都会自动旋转,而非只有单一界面。我的解决方式是,写一个VC的Category,关闭自动旋转,然后放在PCH文件里面,然后针对需要的VC,手动打开。感谢你上面提供的思路!
    小布走慢点:@逗啊 这个可能需要手动的旋转才行
    人人为它:问一下哈。你这样写。到了那个单一旋转的页面后。你退出那个页面后,上一个页面不会自动转回来的问题是怎么处理的。
    小布走慢点:感谢你的用心,的确你这个方法很棒.Demo 比较简单提供一个思路
  • chinwy:道理我都懂 然鹅
    我想请问一下楼主
    xcode 8 在storyboard里面还有没有旋转单个屏幕的办法
    我只要设置旋转 所有的屏幕都旋转了 ..><
    小布走慢点:@chinwy 在plist里设置的,不是在storyboard设置
  • 2620da6c0f33:网上关于很多特定页面横竖屏的方法,这个觉得是比较好的一个,感谢楼主无私分享!!!

本文标题:iOS屏幕旋转各类集锦(一)-单页旋转

本文链接:https://www.haomeiwen.com/subject/dlkclttx.html