转自:http://blog.csdn.net/cococoolwhj/article/details/8208991
概述:
在iOS6之前的版本中,通常使用 shouldAutorotateToInterfaceOrientation 来单独控制某个UIViewController的方向,需要哪个viewController支持旋转,只需要重写shouldAutorotateToInterfaceOrientation方法。
但是iOS 6里屏幕旋转改变了很多,之前的 shouldAutorotateToInterfaceOrientation 被列为 DEPRECATED 方法,查看UIViewController.h文件也可以看到:
- // Applications should use supportedInterfaceOrientations and/or shouldAutorotate..
- - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation NS_DEPRECATED_IOS(2_0, 6_0);
程序将使用如下2个方法来代替:
- - (BOOL)shouldAutorotate;
- - (NSUInteger)supportedInterfaceOrientations;
除了重写这个2个方法,IOS6里面要旋转还有一些需要注意的地方,下面会细述。另外还有一个硬性条件,需要在Info.plist文件里面添加程序支持的所有方向,可以通过以下2种方式添加
1.
2.
另外要兼容IOS6之前的系统,要保留原来的 shouldAutorotateToInterfaceOrientation 方法,还有那些 willRotateToInterfaceOrientation 等方法。
IOS6自动旋转设置:
- UIViewController *viewCtrl = [[UIViewController alloc] init];
- UINavigationController *navCtrl = [[UINavigationController alloc] initWithRootViewController:viewCtrl];
- if ([window respondsToSelector:@selector(setRootViewController:)]) {
- self.window.rootViewController = navCtrl;
- } else {
- [self.window addSubview:navCtrl.view];
- }
- -(NSUInteger)supportedInterfaceOrientations{
- return UIInterfaceOrientationMaskAllButUpsideDown;
- }
- - (BOOL)shouldAutorotate{
- return YES;
- }
- UIViewController *viewCtrl2 = [[UIVewController alloc] init];
- [self.navigationController.navigationController pushViewController:viewCtrl2 animated:YES];
- - (BOOL)shouldAutorotate
- {
- return self.topViewController.shouldAutorotate;
- }
- - (NSUInteger)supportedInterfaceOrientations
- {
- return self.topViewController.supportedInterfaceOrientations;
- }
eg3:如果viewCtrl 是 presentModalViewController 到 viewCtrl3,那么viewCtrl3的旋转设置就不在navCtrl里面了!如果presentModalViewController的viewController是navController、tabbarController包装过的viewCtrl3,那么就应在新包装的navController、tabbarController里面设置,如果是直接presentModalViewController到viewCtrl3,那么就在viewCtrl3里面设置
手动旋转
手动旋转也有2种方式,一种是直接设置 UIDevice 的 orientation,但是这种方式不推荐,上传appStore有被拒的风险:
- if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) {
- [[UIDevice currentDevice] performSelector:@selector(setOrientation:) withObject:(id)UIInterfaceOrientationPortrait];
- }
第二种是假旋转,并没有改变UIDevice 的 orientation,而是改变某个view的 transform,利用 CGAffineTransformMakeRotation 来达到目的,比如:
- self.view.transform = CGAffineTransformMakeRotation(M_PI/2)
下面讲解采用第二种方式的各版本手动旋转:
思想是首先设置 statusBarOrientation,然后再改变某个view的方向跟 statusBarOrientation 一致!
IOS6手动旋转:
1. 那既然是旋转,最少也得有2个方向,那么还是少不了上面说的那个硬性条件,先在plist里面设置好所有可能需要旋转的方向。既然是手动旋转,那么就要关闭自动旋转:
- - (BOOL)shouldAutorotate{
- return NO;
- }
2.手动触发某个按钮,调用方法,这个方法的实现如下:
- [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];
- self.view.transform = CGAffineTransformMakeRotation(M_PI/2);
- 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
- - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{
- return (interfaceOrientation == [UIApplication sharedApplication].statusBarOrientation);
- }
2.手动触发某个按钮,调用方法,这个方法的实现如下:
- [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];
- self.view.transform = CGAffineTransformMakeRotation(M_PI/2);
- 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代替或者直接写死数字!
- -(NSUInteger)supportedInterfaceOrientations{
- return [UIApplication sharedApplication].statusBarOrientation;
- }
3.一般都不建议在程序里面直接调用 UIDeviceOrientation 的方向,而是用 UIInterfaceOrientation,他们之间是不同的!
- UIInterfaceOrientationLandscapeLeft = UIDeviceOrientationLandscapeRight,
- 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"旨在帮助开发者解决在不同iOS版本间实现屏幕旋转时可能遇到的问题。 在iOS 5.1中,屏幕旋转的管理主要通过`shouldAutorotateToInterfaceOrientation:`方法来实现,这是一个...
首先,iOS系统默认提供了自动屏幕旋转功能,它会根据设备的实际物理方向来改变UI的布局。这一功能由UIKit框架中的`UIDevice`类提供,其`orientation`属性反映了设备当前的方向。然而,开发者有时需要对屏幕旋转进行...
在iOS系统中,屏幕旋转功能默认是根据应用的设置来决定是否支持横屏或竖屏显示的。然而,有时开发者可能需要实现一个特定的功能,使得应用程序在任何版本的iOS(从iOS11到iOS17)上都能强制进行屏幕旋转。这种需求在...
ios6.0的屏幕旋转机制和之前的版本有很大的不同了,这个资源就是我自己写的支持ios6.0屏幕旋转的例子。是navigationController作为rootViewController的例子,通过重写一个navigationController类来实现。对屏幕旋转...
在iOS应用中,我们通常需要对特定的页面或视图控制器实现自定义的屏幕旋转逻辑,而不是简单地依赖系统的自动设置。这个"ios-屏幕旋转的对于某个页面不是系统设置(是自定义的).zip"压缩包可能包含了一个示例项目,...
iOS屏幕旋转是iOS开发中经常需要处理的功能,主要涉及到用户界面的方向变化,如从竖屏变为横屏,或者反过来。在iOS开发中,实现屏幕旋转控制主要有两种方法,一种是全局控制,另一种是局部控制。接下来,我们将详细...
iOS 5引入了新的屏幕旋转管理机制,与之前的版本有所不同。本文将详细解析iOS 5中的屏幕旋转处理,并基于提供的“LandscapeDemoIos5”项目文件进行讲解。 首先,iOS 5之前,应用程序通常使用UIViewController的...
在iOS开发中,屏幕旋转是一个常见的需求,尤其在构建多用途的应用时,用户可能期望在不同设备方向下都能获得良好的体验。"IOS屏幕旋转.zip"这个压缩包提供了一个解决方案,它着重于在不使用私有API的情况下,通过...
在iOS开发中,创建一个可适应屏幕旋转的悬浮窗是一个常见的需求,这通常涉及到UIWindow的使用和屏幕方向的管理。下面将详细讲解如何利用UIWindow实现这样的功能,并结合"FloatWindowDemo"这个示例项目进行说明。 ...
本篇文章将深入探讨iOS系统中的屏幕旋转机制,包括如何处理屏幕旋转事件、实现自动旋转以及手动控制旋转,同时也会涉及到相关的API和技术。 首先,iOS设备具有内置的传感器,如加速度计和陀螺仪,用于检测设备的...
如果你的应用使用Auto Layout,系统会自动调整约束以适应新的屏幕方向。确保你的约束设置正确,以便在旋转后界面能正确显示。 7. **测试**: 最后,确保在模拟器和真机上充分测试所有支持的方向,以确保旋转行为...
在iOS6之前,屏幕旋转主要是通过UIViewController的`shouldAutorotateToInterfaceOrientation:`方法来控制的。开发者可以在这个方法中返回YES或NO,以决定当前控制器是否支持特定的设备方向。然而,随着iOS6的发布,...
"ios6系统图标原生"是指iOS 6操作系统中,苹果公司官方设计的一系列应用程序图标。这些图标通常遵循苹果的Human Interface Guidelines (HIG),确保一致性和用户体验的质量。在iOS 6中,这些图标的设计风格和色彩搭配...
- `-(BOOL)shouldAutorotate`:系统在尝试自动旋转屏幕前会先询问此方法,返回YES表示允许旋转。 - `-(UIInterfaceOrientationMask)supportedInterfaceOrientations`:返回应用支持的界面方向集合。 - `- ...
在iOS开发中,用户界面通常会根据设备的方向自动调整布局,以适应横屏或竖屏模式。然而,有些特殊情况可能需要我们对特定视图控制器的行为进行定制,比如强制使其保持固定的方向,即使设备本身旋转了。`...
当iOS设备的图片被上传到服务器,例如一个基于Java的系统,如果不考虑Exif信息,图片可能会按照原始的Exif方向被保存,导致在非iOS设备上查看时出现旋转。为了解决这个问题,我们需要在Java后端处理图片之前,先读取...
此外,iOS 6之后引入了shouldAutorotate和supportedInterfaceOrientations这两个方法,用于控制视图控制器是否响应自动旋转以及支持哪些屏幕方向。在iOS 8及以上版本,你需要重写这两个方法来允许或禁止特定的屏幕...
在iOS应用开发中,Swift语言提供了多种方法来处理屏幕旋转,以适应用户的不同设备和使用习惯。屏幕旋转是用户体验中的重要一环,合理的旋转管理能让应用程序更具灵活性和易用性。本文将深入探讨Swift中实现屏幕旋转...
【iOS 360度旋转效果Demo】是一个用于展示如何在iOS应用中实现图像360度连续旋转的示例项目。这个Demo适用于iPhone 6.1设备,并且已经在该设备上进行了成功的测试。它通过使用`UIImageView`这一UI组件,来实现图片的...
iOS模拟点击屏幕,自动化脚本,点击手势等模拟操作 iOS模拟点击屏幕,自动化脚本,点击手势等模拟操作 iOS模拟点击屏幕,自动化脚本,点击手势等模拟操作 iOS模拟点击屏幕,自动化脚本,点击手势等模拟操作