原文链接地址: http://ytwhw.iteye.com/blog/1767465

在此谢谢原博主的精心整理!

关注小白,共同成长!

苹果的产品iPad和iPhone都是支持自动旋转的,因而我们写的程序也要支持两种视图:纵向和横向。

默认情况下,我们写的程序都是纵向的,就像前边的几个例子中那样。如果运行以前写的程序,当把模拟器旋转,你会发现很不友好,有的控件看不见了。这个时候,自动旋转就显得很有必要了。

1、我们先不谈如何实现自动旋转,先讲讲如何让程序知道它支持哪几种旋转。

运行Xcode 4.2,新建一个Single View Application,程序名为RotateTest,其他设置如下图:

创建好工程后,打开的第一个页面包含如下视图:

我们可以在这里设置程序支持哪种旋转,只需选中那个按钮。从上图可以看出,默认情况下,iPhone程序不支持倒过来的旋转,因为如果视图是倒过来 的,而此时突然来电话,那么会很不方便,因为页面依然是倒过来的。但是,如果你创建了一个iPad程序,你回发现上图四个按钮都是选中的,即iPad程序 默认支持所有旋转。

注意,如果为程序创建了多个View Controller,那么每个View Controller都要可以设置所支持的旋转,不过,新建的View Controller设置的值必须是主View Controller的子集。

其实,我们修改上图中的按钮,实质上修改的是我们程序的plist文件,在这个工程中,是RotateTest-Info.plist文件,如下图,展开这个文件,最下面显示的就是所支持的旋转:

上面是设置支持选中的一种方法。我们也可以在代码中设定所支持的旋转。打开ViewController.m,找到shouldAutorotateToInterfaceOrientation方法,完整代码如下:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

{

// Return YES for supported orientations

return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);

}

上面的代码表明,不支持倒转(UIInterfaceOrientationPortraitUpsideDown)。

iOS中定义了四个表示方向的变量:

UIInterfaceOrientationPortrait

UIInterfaceOrientationPortraitUpsideDown

UIInterfaceOrientationLandscapeLeft

UIInterfaceOrientationLandscapeRight

如果iOS设置旋转了,程序就会调用这个方向,如果返回YES就旋转视图,否则的话就不旋转。如果你建立了一个iPad程序,这个方法就是简单的返回YES。

2、既然我们已经让程序知道支持什么旋转了,下面讲讲如何实现。

在iOS中有三种方法可以实现自动旋转。

(1)最简单的方法就是利用Xcode中的Size Inpector:

(2)在View所对应的ViewController.m中重写willAnimateRotationToInterfaceOrientation方法,在这个方法中重新设置控件的大小与位置。

(3)再新建一个视图,这样,我们有两个视图了,一个纵向,一个横向。在这两个视图上设计好了之后,当旋转时根据旋转方向,调用相应的视图。

3、以下是这三个方法的简单使用。

3.1 使用Size Inpector实现自动旋转:

① 单击ViewController.xib,在打开的视图区域拖放两个Button在上面,分别命名为“按钮上”和“按钮下”,页面布局如下图:

图中两个按钮在水平方向上是居中放置的。

② 运行程序,并将模拟器旋转,对比一下旋转前后的效果:

旋转之后,“按钮下”不见了。不过,“按钮上”的坐标和大小其实是没变的。

我现在想实现旋转之后两个按钮还是水平方向居中,并且还是一个在顶端、一个在底端。为实现这个,我要做以下工作:

③ 在View中选中“按钮上”,打开Size Inspector,把左边的红实线改成虚线:

④ 在View中选中“按钮下”,打开Size Inspector,把左边和上边的红实线改成虚线,下边的红虚线改成实线:

外围的红实线表示距离不变,例如上图右中下方的红实线就表示对应的控件与下方的距离不变,而其他方向会自动调整。现在运行一下并旋转模拟器,看看效果:

3.2 重写willAnimateRotationToInterfaceOrientation方法,重新设置控件的大小与位置

① 首先先给这两个按钮添加Outlet映射到ViewController.h,名称分别是button_1和button_2:

② 在ViewController.m中的@end之前添加以下代码:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval) duration {

if (UIInterfaceOrientationIsPortrait(toInterfaceOrientation)) {

button_1.frame = CGRectMake(124, 20, 72, 37);

button_2.frame = CGRectMake(124, 403, 72, 37);

} else {

button_1.frame = CGRectMake(20, 131, 72, 37);

button_2.frame = CGRectMake(388, 131, 72, 37);

}

}

③ 运行,看看效果:

3.3 创建新视图,旋转时切换视图:

① 我们先创建原始视图的副本,但是还是在原来的ViewController中。单击ViewController.xib,打开IB,在左边的三个图标中 选中View图标,如果用的是Mac Book,那么按住Control键,如果是虚拟机,请按住Alt键。按住后按住鼠标左键,往下拖,鼠标会变成绿色的加号。注意新视图跟原始图是并列的, 所以你要往正确的方向拖,然后松开鼠标,这样就创建了原来视图的副本:

② 调整新视图为横向(Landscape):

选中新视图,打开Attribute Inspector,在Orientation中选择Landscape:

③ 调整新视图中的按钮的位置,你可以按照自己的喜好设置,这里设置成如下所示:

④ 下面,我们为这两个View建立Outlet映射,注意是View,而不是View上的控件。建立映射的方法都是一样,两个名称分别是portrait和landscape:

⑤ 单击ViewController.m,在@implementation那行代码的下一行添加以下语句:

#define degreesToRadians(x) (M_PI*(x)/180.0)

⑥ 修改willAnimateRotationToInterfaceOrientation方法,如下:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {

if (toInterfaceOrientation == UIInterfaceOrientationPortrait) {

self.view = self.portrait;

self.view.transform = CGAffineTransformIdentity;

self.view.transform = CGAffineTransformMakeRotation(degreesToRadians(0));

self.view.bounds = CGRectMake(0.0, 0.0, 320.0, 460.0);

} else if(toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) {

self.view = self.landscape;

self.view.transform = CGAffineTransformIdentity;

self.view.transform = CGAffineTransformMakeRotation(degreesToRadians(-90));

self.view.bounds = CGRectMake(0.0, 0.0, 480.0, 300.0);

} else if(toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) {

self.view = self.landscape;

self.view.transform = CGAffineTransformIdentity;

self.view.transform = CGAffineTransformMakeRotation(degreesToRadians(90));

self.view.bounds = CGRectMake(0.0, 0.0, 480.0, 300.0);

}

}

⑦ 运行,查看效果:

4、小结

这次讲了实现自动旋转调整大小的三种方法,第一种只要点点鼠标,很简单,但不适合复杂的视图;第二种要重新设置控件的大小和位置,代码量会比较大;第三种是创建两种视图,旋转时调用不同的视图,比较适合复杂的视图。

iOS开发屏幕自动旋转与调整大小相关推荐

  1. iOS开发:自动旋转与调整大小

    苹果的产品iPad和iPhone都是支持自动旋转的,因而我们写的程序也要支持两种视图:纵向和横向. 默认情况下,我们写的程序都是纵向的,就像前边的几个例子中那样.如果运行以前写的程序,当把模拟器旋转, ...

  2. IOS应用开发之自动旋转与调整大小

    苹果的产品iPad和iPhone都是支持自动旋转的,因而我们写的程序也要支持两种视图:纵向和横向. 默认情况下,我们写的程序都是纵向的,就像前边的几个例子中那样.如果运行以前写的程序,当把模拟器旋转, ...

  3. iOS开发7:自动旋转与调整大小

    iOS开发7:自动旋转与调整大小 收藏  分享到 发表于 2012-08-31  •  16285 次查看 苹果的产品iPad和iPhone都是支持自动旋转的,因而我们写的程序也要支持两种视图:纵向和 ...

  4. iOS开发屏幕旋转锁定横竖屏解决方法

    iOS开发屏幕旋转锁定横竖屏解决方法 使用场景: 公司最近产品,有两个界面是横屏的,其他的界面是竖屏的.针对这个需求,也调试了一段时间.在网上也查找了不少资料. 解决的方案也是有的,但是都是需要在导航 ...

  5. windows禁用屏幕旋转_如何在Windows 10中禁用屏幕自动旋转

    windows禁用屏幕旋转 Windows 10 can automatically rotate your display if you have a convertible PC or table ...

  6. iOS手动和自动旋转屏幕

    1.手动旋转屏幕函数 - (void)setOrientation: (UIInterfaceOrientation)orientation {if([[UIDevice currentDevice] ...

  7. iphone自动旋转与调整大小

    转自http://my.oschina.net/plumsoft/blog/47289 苹果的产品iPad和iPhone都是支持自动旋转的,因而我们写的程序也要支持两种视图:纵向和横向. 默认情况下, ...

  8. android禁止屏幕自动旋转_如何禁止屏幕翻转

    Android 版需要修改 AndroidManifest.xml 文件,在文件中找到 android:screenOrientation 属性,原值应该是 user,修改成 portrait 就是锁 ...

  9. iOS屏幕自动旋转 以及横屏模式打开APP出现的问题

    首先  项目配置 设置支持方向 创建 UINavigationController父类. tabbar  父类 . uiviewcontroller 父类 UINavigationController ...

最新文章

  1. 【swjtu】数据结构实验课程设计_图的关键路径
  2. 微软转型里程碑:云计算收入首次超过Windows业务
  3. c++学习笔记之继承和多态
  4. vue中this.$router.push()路由传值和获取的两种常见方法
  5. pandas 入门(2)
  6. java使用itext开源包实现pdf文件合并,亲测可用,响应速度快的惊人
  7. 【MLNLP顶会论文发表总榜】谷歌最狂,清北入前十,周明、张岳、刘挺华人前三,中美差距何止一点点!...
  8. mysql(指RDS)验证pureftpd登录
  9. 在html文档中添加 iconfont 图标
  10. join()方法与CSV格式文件
  11. easyUi后台,模板实现前台简易版网上书店功能实现
  12. MFC定时器SetTimer函数
  13. 调用函数,判断一个数是否为素数
  14. 基于OpenCV实现视频的循环播放
  15. MacOS程序和库签名的问题
  16. CST电磁仿真GPU计算工作站、集群最新配置推荐2022
  17. Win7/10快捷方式恢复小箭头
  18. 一个并不“艰难”的决定—一个程序员的成长史(3)
  19. linux发广告软件下载,ADPower广告管理系统(Linux手动安装)
  20. 数据交换格式 - PB(protocol buffer),xml,json,array

热门文章

  1. html二级域名,免费二级域名申请
  2. 独家改良MACD变色指标公式,红柱绿柱变长缩短变色
  3. 如何开启内存超频?来看
  4. 初中毕业学计算机动漫制作,初中毕业学动漫设计可以能学会吗
  5. bzoj4402: Claris的剑
  6. Speedoffice(PPT)如何设置放映方式
  7. VMWare安装苹果Mac OS系统的方法
  8. 中国广电也未能拯救中国移动,中国电信再次逆势反超
  9. 鸿蒙开源oppo,华为鸿蒙开源,OPPO公关黄宏涛被推上风口浪尖,网上一片哗然
  10. Java中的四种引用类型