文档章节

iphone 之 横屏和自动旋转

mahb520
 mahb520
发布于 2014/04/27 20:19
字数 1265
阅读 96
收藏 2
点赞 0
评论 0

IPhone的自动旋转功能一共有3中方法:

1.使用自动调整属性处理旋转。

利用系统自动生成的代码。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);//系统默认不支持旋转功能
}

要想让系统自动实现旋转功能仅需要实现上面的代码,把return (interfaceOrientation == UIInterfaceOrientationPortrait)修改成为return OK即可。

修改后的代码为:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return OK;
}

然后在使用自动调整属性设计界面(Apple+3),指定要支持的方向即可。

在使用模拟仿真器的时候,要让其自动旋转只需Apple+ ->(<-)即可。

 

2.在旋转是重构视图。(也即手动设置每一个控件的位置和大小,让其重新排列)

第一种方法基本上不需要编写代码,这种方法就需要写点代码了,毕竟重新设置每一个控件的坐标了嘛。

下面以我弄的一个为例子,例子的名称为IP_05Autosize。

例如,首先看这个图片:

《Iphone开发基础教程》第五章 <wbr>自动旋转和调整大小

在View中添加6个button,然后设定W和H分别为125和125,这样在横向的时候这三个button是会重叠的,因为在横向的时候Iphone 支持的显示像素为480x300,没有状态栏的情况下是480x320.(在纵向时候显示像素为320x460,没有状态栏的情况下是320x480)。

现在就需要写代码重新排列这六个按钮了。

首先声明变量:

在IP_05AutosizeViewController.h中添加如下的代码:

#import <UIKit/UIKit.h>

@interface IP_05AutosizeViewController : UIViewController {
 IBOutlet UIButton *button1;
 IBOutlet UIButton *button2;
 IBOutlet UIButton *button3;
 IBOutlet UIButton *button4;
 IBOutlet UIButton *button5;
 IBOutlet UIButton *button6;
}
@property (nonatomic,retain)UIView *button1;
@property (nonatomic,retain)UIView *button2;
@property (nonatomic,retain)UIView *button3;
@property (nonatomic,retain)UIView *button4;
@property (nonatomic,retain)UIView *button5;
@property (nonatomic,retain)UIView *button6;

@end

然后在IP_05AutosizeViewController.m中,添加实现方法。

@implementation IP_05AutosizeViewController
@synthesize button1;
@synthesize button2;
@synthesize button3;
@synthesize button4;
@synthesize button5;
@synthesize button6;

-(void)willAnimateSecondHalfOfRotationFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation duration:(NSTimeInterval)duration
{
 UIInterfaceOrientation to=self.interfaceOrientation;
 if(to == UIInterfaceOrientationPortrait || to == UIInterfaceOrientationPortraitUpsideDown)
 {
  button1.frame = CGRectMake(20, 20, 125, 125);
  button2.frame = CGRectMake(175, 20, 125, 125);
  button3.frame = CGRectMake(20, 168, 125, 125);
  button4.frame = CGRectMake(175, 168, 125, 125);
  button5.frame = CGRectMake(20, 315, 125, 125);
  button6.frame = CGRectMake(175, 315, 125, 125);
 }
 else
 {
  button1.frame = CGRectMake(20, 20, 125, 125);
  button2.frame = CGRectMake(20, 155, 125, 125);
  button3.frame = CGRectMake(177, 20, 125, 125);
  button4.frame = CGRectMake(177, 155, 125, 125);
  button5.frame = CGRectMake(328, 20, 125, 125);
  button6.frame = CGRectMake(328, 155, 125, 125);
 }

}

还需要修改- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation的代码:

修改后为:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

{
   return (interfaceOrientation == UIInterfaceOrientationPortrait
   || interfaceOrientation == UIInterfaceOrientationLandscapeLeft
   || interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}

然后在dealloc中释放资源:

- (void)dealloc

{
 [button1 release];
 [button2 release];
 [button3 release];
 [button4 release];
 [button5 release];
 [button6 release];
 [super dealloc];
}

到此代码部分搞定,然后就是连接控制器和视图了。这点应该比较简单了。呵呵!

然后Build and Go最终结果为:

《Iphone开发基础教程》第五章 <wbr>自动旋转和调整大小

 

3.切换视图

这种方法使用于比较复杂的界面,是需要分别设计横向模式和纵向模式,然后在使用的过程中自动切换。

当然了这个也需要确定输出口和一些方法了。

首先定义输出口:

(简单描述,设计两个视图,一个定义为landscape,一个是portrait,一个为320x460,一个为480x300,每一个输出口分别和每个视图中的按钮想关联)

//用于切换的两个View

 IBOutlet UIView *landscape;
 IBOutlet UIView *portrait;
 //Foo两个View中的Foo按钮
 IBOutlet UIButton *landscapeFooButton;
 IBOutlet UIButton *portraitFooButton;
 //Bar两个View中的Bar按钮
 IBOutlet UIButton *landscapeBarButton;
 IBOutlet UIButton *portraitBarButton;

还需要File's Owner和两个View想关联。按住Ctrl将File's Owner拖到Portrait上面,在弹出灰色菜单上选择Portrait同理选择Landscape。然后在按住Ctrl将File's Owner拖到Landscape上面,在弹出的灰色菜单上选择View,让Landscape为自启动View。

然后是方法的实现:
-(void)willAnimateFirstHalfOfRotationToInterfaceOrientation:(UIInterfaceOrientation)to duration:(NSTimeInterval)duration
{
 if(to == UIInterfaceOrientationPortrait)
 {
  self.view = self.portrait;
  self.view.transform = CGAffineTransformIdentity;
  self.view.transform = CGAffineTransformMakeRotation(degressToRadian(0));
  self.view.bounds = CGRectMake(0.0, 0.0, 320.0, 460.0);
 }
 else if (to == UIInterfaceOrientationLandscapeLeft)
 {
  self.view = self.landscape;
  self.view.transform = CGAffineTransformIdentity;
  self.view.transform = CGAffineTransformMakeRotation(degressToRadian(-90));
  self.view.bounds = CGRectMake(0.0, 0.0, 460.0, 320.0);
  
 }
 else if (to == UIInterfaceOrientationPortraitUpsideDown)
 {
  self.view = self.portrait;
  self.view.transform = CGAffineTransformIdentity;
  self.view.transform = CGAffineTransformMakeRotation(degressToRadian(180));
  self.view.bounds = CGRectMake(0.0, 0.0, 320.0, 460.0);
  
 }
 else if (to == UIInterfaceOrientationLandscapeRight)
 {
  self.view = self.landscape;
  self.view.transform = CGAffineTransformIdentity;
  self.view.transform = CGAffineTransformMakeRotation(degressToRadian(90));
  self.view.bounds = CGRectMake(0.0, 0.0, 460.0, 320.0);
  
 }

}

 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

{

       return YES;
}

不要忘了在dealloc中释放资源哦。

因为在上面的代码中使用到了Core Graphics框架,因此要把该框架连接到该项目中,具体的方法是:在Resources上面点右键Add->Existing Frameworks。然后就是查找路径了。我第一次就看错了没有找到,哎,做事情不下心呀!具体路径为:/Developer/Platforms /iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator2.2.1.sdk/System /Library/Frameworks/CoreGraphics.framework 呵呵,这个路径是有点长不好找,记住不是在:/Developer/SDKs里面了,我刚开始就是找到呢里面了。呵呵!还有就是导入后会处理一个提示框, 不要Copy,Reference Type要选择Relative to Current SDK然后add就OK了。

例子中还有一个方法是对View中的按钮实现隐藏的,这个就比较简单了!

具体方法为:

-(IBAction)buttonPressed:(id)sender
{
 if(sender == portraitFooButton||sender == landscapeFooButton)
 {
  portraitFooButton.hidden=YES;
  landscapeFooButton.hidden=YES;
 }
 else
 {
  portraitBarButton.hidden=YES;
  landscapeBarButton.hidden=YES;
 }

}

呵呵,上图两张看看:

刚开始运行时的图片

《Iphone开发基础教程》第五章 <wbr>自动旋转和调整大小

旋转后并且按了Foo按钮后的图片

《Iphone开发基础教程》第五章 <wbr>自动旋转和调整大小


本文转载自:http://www.cnblogs.com/iphone520/archive/2011/10/13/2210418.html

共有 人打赏支持
mahb520
粉丝 21
博文 73
码字总数 24908
作品 0
广州
项目经理
ios 屏幕,状态栏(statusbar),程序窗口 尺寸获取和屏幕旋转时的尺寸变化

app尺寸,去掉状态栏 CGRect r = [ UIScreen mainScreen ].applicationFrame; 这个尺寸不会随着屏幕旋转而交换宽高,但屏幕旋转后,会自动修改宽高减掉状态栏高度。 竖屏时(4寸):x=0, y=20...

cuibo1123
2013/01/18
0
0
ios8之后的界面旋转简单原理

调整约束优先级,不一定都是250.750或者1000 有时不管怎么调整,约束优先级都要大于某个值,只是焦点的俩个可以在大于某个值的范围内取大小值。 ios8之后不用interfaceOrientation属性来判断...

水一样的人儿
2016/08/17
16
0
iPhone自动旋转控制代码-IOS开发

旋转有时候是很好的特性,但是并不是所有的程序界面都想旋转的,因为旋转会使得界面变得不和谐,除非你已经开发了专门针对各种方向的界面,所以有时候还是禁用旋转比较好,或者程序中的某个界...

晨曦之光
2012/03/12
0
0
iPhone设备锁定竖屏情况下,拍照怎样实现横屏旋转,跟系统自带的一样。

iPhone设备锁定竖屏情况下,拍照怎样实现横屏旋转,跟系统自带的一样。

O_o_o_O
2014/12/31
96
0
iPad 和 iPhone Simulator Mac.OS.X.Leopard

这两天玩了玩 XP 系统 通过vmware 装个 Mac.OS.X.Leopard系统。 然后 在下个 iphone 的 SDK 装起来 很卡很卡。。但是 很兴奋 所以 下面是网上的 解说。 拿来分享 首先,默认安装好 SDK 之后,...

长平狐
2012/08/29
1K
0
如何去旧工程适配iOS6和iPhone5

苹果每发布一个系统,都够开发者忙活一阵的,更新xcode适配新系统:像iOS4支持Retain需要@2x的图;像iOS5不支持udid;像现在的iOS6和iPhone5要面对的下面的一堆问题。 1.添加Retina 4 launch i...

长平狐
2013/03/19
280
0
旧工程适配iOS 6和iPhone 5的一些故事

2012-09-29 By dapps  旧工程适配iOS 6和iPhone 5的一些故事抢沙发 分类:iPhone开发 标签:iOS 6、iPhone 5、Retina、适配iOS 6、适配iPhone 5 国内最专业的APP开发者社区,dApps! 苹果每...

Orange1
2012/10/30
0
0
手把手教你做视频播放器(五)-视频列表的横屏

第6节 视频列表的横屏 设备在横放或者竖放的时候都会自动调整应用的布局,进行对应的横屏显示或者竖屏显示。我们的视频列表也是如此。 我们可以用两种方法处理设备旋转的问题, 让Activity不...

anddlecn
2016/07/20
0
0
iOS8开发~UI布局(一)初探Size Class

一、新特性Size Class介绍 随着iOS8系统的发布,一个全新的页面UI布局概念出现,这个新特性将颠覆包括iOS7及之前版本的UI布局方式,这个新特性就是Size Class。Size Class配合Auto Layout可以...

sea_god
2015/01/26
0
0
旧工程适配iOS 6和iPhone 5的一些故事

苹果每发布一个系统,都够开发者忙活一阵的,更新xcode适配新系统:像iOS4支持Retina需要@2x的图;像iOS5不支持udid;像现在的iOS6和iPhone5要面对的下面的一堆问题。 1.添加Retina 4 launch i...

青云_K
2013/01/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

如何进行大数据的入门级学习?

不知道你是计算机专业应届生还是已经从业者。总之,有java基础的学生学习大数据会轻松很多,零基础的小白都需要从java和linux学起。 如果你是一个学习能力特别强,而且自律性也很强的人的话可...

董黎明
10分钟前
0
0
使用Parcelable传递复杂参数

最近做AIDL传递对象,对象必须实现Parcelable的方法才可以被传递。 @Override    public int describeContents() {//这个 默认返回0就行了。        return 0;    }    ...

火云
10分钟前
0
0
十大Intellij IDEA快捷键

Intellij IDEA中有很多快捷键让人爱不释手,stackoverflow上也有一些有趣的讨论。每个人都有自己的最爱,想排出个理想的榜单还真是困难。以前也整理过Intellij的快捷键,这次就按照我日常开发...

HJCui
21分钟前
0
0
word 使用mathtype 编写 数学公式

下载安装,这个链接命名。。。。 http://www.mathtype.cn/xiazai.html 安装之后会多出一个选项 使用内联方式插入图表 编写公式的界面 设置支持latex 语法 输入公式回车就可以看到结果...

阿豪boy
39分钟前
0
0
Promise

定义 Promise是异步编程的一种解决方案,所谓Promise就是一个容器,里面保存着某个未来才会结束的事件(通常是一个一步操作)的结果。 特点: 2.1 对象的状态不受外界影响,三种状态pending...

litCabbage
50分钟前
0
0
设计模式:适配器模式

说明:在不改变旧接口代码的前提下,为该接口新增其他接口的功能 适配器模式可以分为:类适配器模式、对象适配器模式、接口适配器模式 前两种模式下,我会以播放器为例。老版的播放器(Playe...

人觉非常君
50分钟前
0
0
使用VsCode搭建Java开发环境,创建springboot应用

1、在 Visual Studio Code 中打开扩展视图(Ctrl+Shift+X),输入关键词java、spring分别下载Java开发插件包和springboot插件包 2、配置参数 点击设置按钮,进入设置选项,配置用户设置 在用户...

qsyan
54分钟前
21
0
调教属于你的“贾维斯”(给自己挖了一个很大的坑)

今天玩一下现在很火的人工智能。 废话不多说,先来看几张图: 看出什么蹊跷了吗? 再来看一个视频: https://www.zhihu.com/video/1002567561061511168 (演示网址和代码见文末) 人工智能离...

crossin
59分钟前
1
0
ES10-检索入门

1.创建索引,准备数据 定义索引结构 DELETE telegraphPUT telegraph{ "mappings": { "msg":{ "properties": { "title":{ "type": "text", ...

贾峰uk
今天
1
0
css 三角形

1.无边框三角形 条件:width,height设置为0,border-width设置一定的宽度,border-color保留一边有颜色其他三边设置透明 .triangle{ width:0px; height:0px; border-width:40...

爱喝水的小熊
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部