`

IOS6屏幕旋转详解(自动旋转、手动旋转、兼容IOS6之前系统)

    博客分类:
  • IOS
 
阅读更多

转自:http://blog.csdn.net/cococoolwhj/article/details/8208991

 

概述:

在iOS6之前的版本中,通常使用 shouldAutorotateToInterfaceOrientation 来单独控制某个UIViewController的方向,需要哪个viewController支持旋转,只需要重写shouldAutorotateToInterfaceOrientation方法。

但是iOS 6里屏幕旋转改变了很多,之前的 shouldAutorotateToInterfaceOrientation 被列为 DEPRECATED 方法,查看UIViewController.h文件也可以看到:

 

[cpp] view plaincopy
 
  1. // Applications should use supportedInterfaceOrientations and/or shouldAutorotate..
  2. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation NS_DEPRECATED_IOS(2_0, 6_0);

 

程序将使用如下2个方法来代替:

 

[cpp] view plaincopy
 
  1. - (BOOL)shouldAutorotate;
  2. - (NSUInteger)supportedInterfaceOrientations;

除了重写这个2个方法,IOS6里面要旋转还有一些需要注意的地方,下面会细述。另外还有一个硬性条件,需要在Info.plist文件里面添加程序支持的所有方向,可以通过以下2种方式添加

 

1.


 

2.


 

另外要兼容IOS6之前的系统,要保留原来的 shouldAutorotateToInterfaceOrientation 方法,还有那些 willRotateToInterfaceOrientation 等方法。

 

IOS6自动旋转设置:

IOS6里面,控制某个viewController旋转并不是像IOS5或者IOS4一样在这个viewController里面重写上面那2个方法,而是需要在这个viewController的rootViewController(根视图控制器)里面重写,怎么解释呢?就是最前面的那个viewController,直接跟self.window接触的那个controller,比如以下代码:
[cpp] view plaincopy
 
  1. UIViewController *viewCtrl = [[UIViewController alloc] init];
  2. UINavigationController *navCtrl = [[UINavigationController alloc] initWithRootViewController:viewCtrl];
  3. if ([window respondsToSelector:@selector(setRootViewController:)]) {
  4. self.window.rootViewController = navCtrl;
  5. } else {
  6. [self.window addSubview:navCtrl.view];
  7. }
如果需要设置viewCtrl的旋转,那么不能在UIViewController里面重写shouldAutorotate和supportedInterfaceOrientations方法,而是需要在navCtrl里面设置,又因为UINavigationController是系统控件,所以这里需要新建一个UINavigationController的子navigationController的子类,然后在里面实现shouldAutorotate和supportedInterfaceOrientations方法,比如:
[cpp] view plaincopy
 
  1. -(NSUInteger)supportedInterfaceOrientations{
  2. return UIInterfaceOrientationMaskAllButUpsideDown;
  3. }
  4. - (BOOL)shouldAutorotate{
  5. return YES;
  6. }
eg1:如果上面的例子是self.window.rootViewController = viewCtrl,而不是navCtrl,那么上面的那2个控制旋转的方法就应该写在UIViewController里面!
 
eg2:如果viewCtrl又pushViewController到viewCtrl2,需要设置viewCtrl2的旋转,怎么办呢? 还是在navCtrl里面控制,因为viewCtrl和viewCtrl2的rootViewController都是navCtrl,一般的写法都是
[cpp] view plaincopy
 
  1. UIViewController *viewCtrl2 = [[UIVewController alloc] init];
  2. [self.navigationController.navigationController pushViewController:viewCtrl2 animated:YES];
所以要控制一个UINavigationController push到的所有viewController的旋转,那么就得在navCtrl里面区分是哪个viewController,以便对他们一一控制!同样如果rootViewController是UITabbarController,那么需要在子类化的UITabbarController里面重写那2个方法,然后分别控制!
 
但是有时候我初始化UINavigationController的时候,并不知道所有我所有需要push到的viewController,那么这里有一个通用的方法,就是让viewController自己来控制自己,首先在navCtrl里面的实现方法改为以下方式:
[cpp] view plaincopy
 
  1. - (BOOL)shouldAutorotate
  2. {
  3. return self.topViewController.shouldAutorotate;
  4. }
  5. - (NSUInteger)supportedInterfaceOrientations
  6. {
  7. return self.topViewController.supportedInterfaceOrientations;
  8. }
全部调用self.topViewController,就是返回当前呈现出来的viewController里面的设置,然后在viewCtrl、viewCtrl2等等这些viewController里面重写shouldAutorotate和supportedInterfaceOrientations,以方便设置每个viewController的旋转

eg3:如果viewCtrl 是
presentModalViewController 到 viewCtrl3,那么viewCtrl3的旋转设置就不在navCtrl里面了!如果presentModalViewController的viewController是navController、tabbarController包装过的viewCtrl3,那么就应在新包装的navController、tabbarController里面设置,如果是直接presentModalViewController到viewCtrl3,那么就在viewCtrl3里面设置
 

IOS5、IOS4自动旋转设置

这个简单很多,没有上面的硬性条件,只需要在需要旋转的viewController里面重写 shouldAutorotateToInterfaceOrientation 方法就行
 

手动旋转

手动旋转也有2种方式,一种是直接设置 UIDevice 的 orientation,但是这种方式不推荐,上传appStore有被拒的风险:

[cpp] view plaincopy
 
  1. if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) {
  2. [[UIDevice currentDevice] performSelector:@selector(setOrientation:) withObject:(id)UIInterfaceOrientationPortrait];
  3. }

第二种是假旋转,并没有改变UIDevice 的 orientation,而是改变某个view的 transform,利用 CGAffineTransformMakeRotation 来达到目的,比如:

[cpp] view plaincopy
 
  1. self.view.transform = CGAffineTransformMakeRotation(M_PI/2)


下面讲解采用第二种方式的各版本手动旋转:

思想是首先设置 statusBarOrientation,然后再改变某个view的方向跟 statusBarOrientation 一致!

 

IOS6手动旋转:

1. 那既然是旋转,最少也得有2个方向,那么还是少不了上面说的那个硬性条件,先在plist里面设置好所有可能需要旋转的方向。既然是手动旋转,那么就要关闭自动旋转:

[cpp] view plaincopy
 
  1. - (BOOL)shouldAutorotate{
  2. return NO;
  3. }

2.手动触发某个按钮,调用方法,这个方法的实现如下:

[cpp] view plaincopy
 
  1. [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];
  2. self.view.transform = CGAffineTransformMakeRotation(M_PI/2);
  3. self.view.bounds = CGRectMake(0, 0, kScreenHeight, 320);

注意:
1. 只需要改变self.view.transform,那么self.view的所有subview都会跟着自动变;其次因为方向变了,所以self.view的大小需要重新设置,不要使用self.view.frame,而是用bounds。
2. 如果shouldAutorotate 返回YES的话,下面设置setStatusBarOrientation 是不管用的!setStatusBarOrientation只有在shouldAutorotate 返回NO的情况下才管用!

 

IOS5、IOS4手动旋转:

1.在需要手动旋转的viewController里的 shouldAutorotateToInterfaceOrientation 方法设置 interfaceOrientation == [UIApplicationsharedApplication].statusBarOrientation

[cpp] view plaincopy
 
  1. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{
  2. return (interfaceOrientation == [UIApplication sharedApplication].statusBarOrientation);
  3. }

2.手动触发某个按钮,调用方法,这个方法的实现如下:

[cpp] view plaincopy
 
  1. [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];
  2. self.view.transform = CGAffineTransformMakeRotation(M_PI/2);
  3. self.view.bounds = CGRectMake(0, 0, kScreenHeight, 320);

注意:只需要改变self.view.transform,那么self.view的所有subview都会跟着自动变;其次因为方向变了,所以self.view的大小需要重新设置,不要使用self.view.frame,而是用bounds。

 

 

经验分享:

1.IOS6里面,如果一个项目里面需要各种旋转支持,有自动,有手动,那么我们可以新建2个navController或者tabbarController的子类,一个是不旋转,一个旋转,那么所有需要旋转的UINavigationController都可以用这个子类来代替!包括我们可以定制短信呀、邮件呀的旋转!
2.supportedInterfaceOrientations 方法一般是写UIInterfaceOrientationMask方向,但是如果程序要兼容4.3以下的SDK(4.3以下的SDK必须是4.5以下的Xcode,不支持IOS6),那么在用4.5以下的Xcode编译的时候通不过!所以可以用statusBarOrientation代替或者直接写死数字!

[cpp] view plaincopy
 
  1. -(NSUInteger)supportedInterfaceOrientations{
  2. return [UIApplication sharedApplication].statusBarOrientation;
  3. }

3.一般都不建议在程序里面直接调用 UIDeviceOrientation 的方向,而是用 UIInterfaceOrientation,他们之间是不同的!

[cpp] view plaincopy
 
  1. UIInterfaceOrientationLandscapeLeft = UIDeviceOrientationLandscapeRight,
  2. UIInterfaceOrientationLandscapeRight = UIDeviceOrientationLandscapeLeft

看到吗,左右是反的!Xcode图形化设置方向也是以 UIInterfaceOrientation 为准,就是home按键所在的方向

参考:
http://blog.csdn.net/totogogo/article/details/8002173
http://stackoverflow.com/questions/13200220/how-to-change-keyboard-orientation-in-ios6
http://blog.csdn.net/yiyaaixuexi/article/details/8035014

分享到:
评论

相关推荐

    iOS5.1与iOS6.0屏幕旋转兼容demo

    本示例"iOS5.1与iOS6.0屏幕旋转兼容demo"旨在帮助开发者解决在不同iOS版本间实现屏幕旋转时可能遇到的问题。 在iOS 5.1中,屏幕旋转的管理主要通过`shouldAutorotateToInterfaceOrientation:`方法来实现,这是一个...

    ios-屏幕旋转demo.zip

    首先,iOS系统默认提供了自动屏幕旋转功能,它会根据设备的实际物理方向来改变UI的布局。这一功能由UIKit框架中的`UIDevice`类提供,其`orientation`属性反映了设备当前的方向。然而,开发者有时需要对屏幕旋转进行...

    iOS强制屏幕旋转兼容iOS11到iOS17

    在iOS系统中,屏幕旋转功能默认是根据应用的设置来决定是否支持横屏或竖屏显示的。然而,有时开发者可能需要实现一个特定的功能,使得应用程序在任何版本的iOS(从iOS11到iOS17)上都能强制进行屏幕旋转。这种需求在...

    ios6屏幕旋转和支持iphone5的4inch屏幕例子

    ios6.0的屏幕旋转机制和之前的版本有很大的不同了,这个资源就是我自己写的支持ios6.0屏幕旋转的例子。是navigationController作为rootViewController的例子,通过重写一个navigationController类来实现。对屏幕旋转...

    ios-屏幕旋转的对于某个页面不是系统设置(是自定义的).zip

    在iOS应用中,我们通常需要对特定的页面或视图控制器实现自定义的屏幕旋转逻辑,而不是简单地依赖系统的自动设置。这个"ios-屏幕旋转的对于某个页面不是系统设置(是自定义的).zip"压缩包可能包含了一个示例项目,...

    ios_屏幕旋转

    iOS屏幕旋转是iOS开发中经常需要处理的功能,主要涉及到用户界面的方向变化,如从竖屏变为横屏,或者反过来。在iOS开发中,实现屏幕旋转控制主要有两种方法,一种是全局控制,另一种是局部控制。接下来,我们将详细...

    ios5旋转屏幕

    iOS 5引入了新的屏幕旋转管理机制,与之前的版本有所不同。本文将详细解析iOS 5中的屏幕旋转处理,并基于提供的“LandscapeDemoIos5”项目文件进行讲解。 首先,iOS 5之前,应用程序通常使用UIViewController的...

    IOS屏幕旋转.zip

    在iOS开发中,屏幕旋转是一个常见的需求,尤其在构建多用途的应用时,用户可能期望在不同设备方向下都能获得良好的体验。"IOS屏幕旋转.zip"这个压缩包提供了一个解决方案,它着重于在不使用私有API的情况下,通过...

    iOS适应屏幕旋转的悬浮窗

    在iOS开发中,创建一个可适应屏幕旋转的悬浮窗是一个常见的需求,这通常涉及到UIWindow的使用和屏幕方向的管理。下面将详细讲解如何利用UIWindow实现这样的功能,并结合"FloatWindowDemo"这个示例项目进行说明。 ...

    ios屏幕旋转ios屏幕旋转

    本篇文章将深入探讨iOS系统中的屏幕旋转机制,包括如何处理屏幕旋转事件、实现自动旋转以及手动控制旋转,同时也会涉及到相关的API和技术。 首先,iOS设备具有内置的传感器,如加速度计和陀螺仪,用于检测设备的...

    屏幕旋转-兼容iOS16以上全部代码

    如果你的应用使用Auto Layout,系统会自动调整约束以适应新的屏幕方向。确保你的约束设置正确,以便在旋转后界面能正确显示。 7. **测试**: 最后,确保在模拟器和真机上充分测试所有支持的方向,以确保旋转行为...

    《源代码》屏幕旋转

    在iOS6之前,屏幕旋转主要是通过UIViewController的`shouldAutorotateToInterfaceOrientation:`方法来控制的。开发者可以在这个方法中返回YES或NO,以决定当前控制器是否支持特定的设备方向。然而,随着iOS6的发布,...

    ios6系统图标原生

    "ios6系统图标原生"是指iOS 6操作系统中,苹果公司官方设计的一系列应用程序图标。这些图标通常遵循苹果的Human Interface Guidelines (HIG),确保一致性和用户体验的质量。在iOS 6中,这些图标的设计风格和色彩搭配...

    [IOS]无xib屏幕旋转,完整demo

    - `-(BOOL)shouldAutorotate`:系统在尝试自动旋转屏幕前会先询问此方法,返回YES表示允许旋转。 - `-(UIInterfaceOrientationMask)supportedInterfaceOrientations`:返回应用支持的界面方向集合。 - `- ...

    iOS UIAlertController的强制旋转

    在iOS开发中,用户界面通常会根据设备的方向自动调整布局,以适应横屏或竖屏模式。然而,有些特殊情况可能需要我们对特定视图控制器的行为进行定制,比如强制使其保持固定的方向,即使设备本身旋转了。`...

    解决ios拍照上传图片被旋转

    当iOS设备的图片被上传到服务器,例如一个基于Java的系统,如果不考虑Exif信息,图片可能会按照原始的Exif方向被保存,导致在非iOS设备上查看时出现旋转。为了解决这个问题,我们需要在Java后端处理图片之前,先读取...

    ios demo,UIInterfaceOrientation,屏幕旋转的实例

    此外,iOS 6之后引入了shouldAutorotate和supportedInterfaceOrientations这两个方法,用于控制视图控制器是否响应自动旋转以及支持哪些屏幕方向。在iOS 8及以上版本,你需要重写这两个方法来允许或禁止特定的屏幕...

    Swift多种屏幕旋转方式

    在iOS应用开发中,Swift语言提供了多种方法来处理屏幕旋转,以适应用户的不同设备和使用习惯。屏幕旋转是用户体验中的重要一环,合理的旋转管理能让应用程序更具灵活性和易用性。本文将深入探讨Swift中实现屏幕旋转...

    ios 360度旋转效果demo

    【iOS 360度旋转效果Demo】是一个用于展示如何在iOS应用中实现图像360度连续旋转的示例项目。这个Demo适用于iPhone 6.1设备,并且已经在该设备上进行了成功的测试。它通过使用`UIImageView`这一UI组件,来实现图片的...

    ZSFakeTouch iOS模拟点击屏幕

    iOS模拟点击屏幕,自动化脚本,点击手势等模拟操作 iOS模拟点击屏幕,自动化脚本,点击手势等模拟操作 iOS模拟点击屏幕,自动化脚本,点击手势等模拟操作 iOS模拟点击屏幕,自动化脚本,点击手势等模拟操作

Global site tag (gtag.js) - Google Analytics