在移动开发过程。您可能需要跨越看看你的手机。有可能是所有的接口必须跨越,有可能是一个交叉通过电话,当用户当,你的接口也希望他能跨越。还有可能的是,界面的一部分需要被侧向显示。视情况而定,有不同的方法来解决。

首先,我们想澄清,以两种方式方向,向。一种是视图方向。设备方向有两种方式能够改变,一个是通过重力加速计,即旋转屏幕的方式去改变,一个是通过代码,调用UIDevice的方式去改变!

直接设置 UIDevice 的 orientation,可是这样的方式不推荐,上传appStore有被拒的风险。

if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) {  
    [[UIDevice currentDevice] performSelector:@selector(setOrientation:) withObject:(id)UIInterfaceOrientationPortrait];  
}

我们都是通过改变视图的方向来让屏幕旋转的。

情景一:程序中全部界面都是横屏显示的

解决的方法:改动project配置文件plist。里面的UISupportedInterfaceOrientations属性表示程序支持的方向。我们把它改成仅仅支持Left和Right

<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>

UIInterfaceOrientationPortrait表示Home键button的方向,也就是竖屏方向,不要他

这样。程序启动的时候就是横屏显示了,当然你须要使用横屏的插件来设计界面了,能够使用

 Interface Builder工具 

解决的方法二:调整window的方向。这样就不用每一个view都改变了
设置状态条的方向和使用transform旋转一下window.不翻状态条的方向,会出现键盘也不会跟着翻.假设仅仅是翻了某个view,那么会出现其他view不会翻.对于我的详细情况,翻window最简单.
UIApplication *application=[UIApplication sharedApplication];
[application setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];
application.keyWindow.transform=CGAffineTransformMakeRotation(M_PI);

注:须要设置程序不会自己主动响应自己主动旋转

//由于想要手动旋转,所以先关闭自己主动旋转
- (BOOL)shouldAutorotate{
return NO;
}

情景二:程序中仅仅有某个view须要横屏显示,手动设置。不支持重力加速器感应

解决的方法:在指定的ViewController里面进行设置,取消自己主动旋转,调用CGAffineTransformMakeRotation让视图旋转。并又一次定义大小

这时plist里面就不能像之前那么设置了。要把UIInterfaceOrientationPortrait也加进去,由于还有别的页面是竖屏的
首先关闭自己主动旋转,在ViewController.m里面加上这句
//由于想要手动旋转,所以先关闭自己主动旋转
- (BOOL)shouldAutorotate{
return NO;
}

然后就是实现旋转的代码了,我们使用的是假旋转,并没有改变 UIDevice 的 orientation,而是改变某个view的 transform,利用 CGAffineTransformMakeRotation 来达到目的

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib. //实例化chart
cv =[[ChartViewBase alloc] initWithFrame:CGRectMake(0, 0, 320, 240)];
[self.view addSubview:cv]; //旋转屏幕,可是仅仅旋转当前的View
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];
self.view.transform = CGAffineTransformMakeRotation(M_PI/2);
CGRect frame = [UIScreen mainScreen].applicationFrame;
self.view.bounds = CGRectMake(0, 0, frame.size.height, 320);
}

注意:

1. 仅仅须要改变self.view.transform,那么self.view的全部subview都会跟着自己主动变;其次由于方向变了,所以self.view的大小须要又一次设置,不要使用self.view.frame,而是用bounds。

2. 假设shouldAutorotate 返回YES的话,以下设置setStatusBarOrientation 是无论用的!setStatusBarOrientation仅仅有在shouldAutorotate 返回NO的情况下才管用。




情景三:程序须要支持重力感应。当用户把手机横过来,程序也要横过来
解决方式:又一次下面两个方法
- (BOOL)shouldAutorotate;  
- (NSUInteger)supportedInterfaceOrientations;

IOS6里面,控制某个viewController旋转并非像IOS5或者IOS4一样在这个viewController里面重写上面那2个方法,而是须要在这个viewController的rootViewController(根视图控制器)里面重写,怎么解释呢?就是最前面的那个viewController,直接跟self.window接触的那个controller。

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];  

假设须要设置viewCtrl的旋转。那么不能在UIViewController里面重写shouldAutorotate和supportedInterfaceOrientations方法,而是须要在navCtrl里面设置,又由于UINavigationController是系统控件,所以这里须要新建一个UINavigationController的子navigationController的子类,然后在里面实现shouldAutorotate和supportedInterfaceOrientations方法,比方:

-(NSUInteger)supportedInterfaceOrientations{  
    return UIInterfaceOrientationMaskAllButUpsideDown;  
}  
  
- (BOOL)shouldAutorotate{  
    return YES;  
}  

版权声明:本文博客原创文章,博客,未经同意,不得转载。

IOS开发——手动设置屏幕旋转的更多相关文章

  1. iOS开发--应用设置及用户默认设置——转载

    [链接]iOS开发--应用设置及用户默认设置[1.bundlehttp://www.jianshu.com/p/6f2913f6b218 在iphone里面,应用都会在“设置”里面有个专属的应用设置, ...

  2. unity 设置屏幕旋转

    只允许竖屏: Portrait                    √ Portrait Upside Down √ Landscape Right        × Landscape Left ...

  3. iOS开发--应用设置及用户默认设置【2、读取应用中的设置】

            在上一节中,我们通过探讨应用的系统设置的基本功能,了解运用bundle捆绑包以及plist文件的基本开发.用户能够使用设置应用来声明他们的偏好设置,那么我们怎样去调用用户所设置的参数呢 ...

  4. iOS开发--应用设置及用户默认设置【1、bundle的运用】

           在iphone里面,应用都会在“设置”里面有个专属的应用设置,选择该菜单界面,用户便可以在其中输入和更改各种选项,协助用户更便捷设置个人喜好与习惯. 在这一节中,希望能通过对捆绑包(bu ...

  5. OpenGL ES: iOS 自定义 UIView 响应屏幕旋转

    iOS下使用OpenGL 如果使用GLKit View 那么不用担心屏幕旋转的问题,说明如下: If you change the size, scale factor, or drawable pr ...

  6. iOS开发中设置UITextField的占位文字的颜色,和光标的颜色

    在iOS开发中,对于很多初学者而言,很有可能碰到需要修改UITextField的占位文字的颜色,以及当UITextField成为第一响应者后光标的颜色,那么下面小编就介绍一下修改占位文字和光标的颜色. ...

  7. IOS开发中设置导航栏主题

    /** * 系统在第一次使用这个类的时候调用(1个类只会调用一次) */ + (void)initialize { // 设置导航栏主题 UINavigationBar *navBar = [UINa ...

  8. IOS开发中设置控件内容对齐方式时容易混淆的几个属性

    IOS开发中四个容易混淆的属性: 1. textAligment : 文字的水平方向的对齐方式 1> 取值 NSTextAlignmentLeft      = 0,    // 左对齐 NST ...

  9. Android设置屏幕旋转后保存数据

    1.onCreate()方法中最后判断需要保存的状态值 if(savedInstanceState != null){ mCurrentIndex = savedInstanceState.getIn ...

随机推荐

  1. 自己做站点(二) 20块钱搞定一个企业站:域名&amp;空间申请

    域名注冊的话,推荐大家用新网,由于申请费用确实非常低,但续费的价格还是比較高的,所以不妨多申请几年.打开站点: http://www.xinnet.com/ 注冊一个帐号,然后申请域名,你能够看到,费 ...

  2. HTML解析HtmlAgilityPack

    原文:HTML解析HtmlAgilityPack //解析页面源代码            Uri surl = new Uri(url);            Uri uriCategory = ...

  3. AndroidMainFest.xml file missing!

    今天在导入项目的时候出现了这种错误: 仅仅须要一步 就搞定: projecct --->  clean  又一次编译一下就可以搞定了.

  4. HDU 4790 Just Random 数学

    链接:pid=4790">http://acm.hdu.edu.cn/showproblem.php?pid=4790 意:从[a.b]中随机找出一个数字x,从[c.d]中随机找出一个 ...

  5. Audio Offload

    Audio Offload 音频分载,是系统将音频分载到声卡硬件进行分载处理的功能.从Windows 8开始,音频的硬件加速和分载处理又回来了.为什么说又回来了呢? 因为声卡自创通公司发明开始,相当长 ...

  6. [ACM] POJ 3259 Wormholes (bellman-ford最短路径,推断是否存在负权回路)

    Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 29971   Accepted: 10844 Descr ...

  7. 你不知道的Eclipse的用法:使用MAT分析Android的内存

    如果使用DDMS确实发现了我们程序中存在内存泄露,那如何定位到具体出现问题的代码片段,最终找到问题所在呢?如果从头到尾分析代码逻辑,那肯定会把人逼疯,特别是在维护别人写的代码的时候.这里介绍一个极好的 ...

  8. windows phone xaml文件中元素及属性(10)

    原文:windows phone xaml文件中元素及属性(10) Textblock xaml文件和隐藏文件 在设计界面的时候我们可以通过xaml中进行设计,这种设计是所见即所得的,很是方便,由于x ...

  9. python学习笔记之四:条件,循环和其他语句

    前面已经介绍过几种基本语句(print,import,赋值语句),下面我们来介绍条件语句,循环语句. 一. print和import的更多信息 1.1 使用逗号输出 A.打印多个表达式,用逗号隔开,会 ...

  10. Oracle SQL Lesson (2) - 限制和排序数据

    重建scott用户@?/rdbms/admin/utlsampl.sql@--执行?--$ORACLE_HOME 字符区分大小写:SELECT last_name, job_id, departmen ...