不好意思,这一篇间隔的时间有点长,最近实在是事情太多,耽搁了,好了,长话短说,下面继续学习ios。

这次学习的内容是Autorotation和Autosizing,Autorotation就是屏幕内容自动旋转,因为iphone有重力感应系统(陀螺仪???),屏幕的内容会随着用户手握iphone的方式(竖着握Portrait、横着握Landscape)而改变,这个相信大家都已经有所体会,Autosizing是指当iphone的屏幕旋转后,屏幕里面控件的大小和位置也会自动改变。好了,下面跟着例子继续学习。

1)创建一个Single View项目,并命名为Autosize。

2)配置app所支持的旋转方向
当完成一个项目创建后,默认状态下,在Project Navigator中,会选中项目的根节点,如下

当根节点选中后,在其右侧Summary tab中找到叫做“Supported Device Orientations”(设备所支持的方向)的区域,在这个区域中,就是用来设置iphone所支持的旋转方向的。

可以看到,一共有4个方向(其实也只有这4个方向),根据进行设置,在我们的这个例子中,就保持默认状态即可,一般情况下,app很少会去选择“Upside Down”,一般来说很少有人会倒着拿手机,除了有特殊情况外。

除了上面的方法可以设置app支持的旋转方向外,还有一个地方可以设置,在Project Navigator中的“Supporting Files”下,选中Autosize-Info.plist。

然后找到“Supported interface Orientations”并展开,会看到3个Item,分别对应刚才图中选中的三个旋转方向

如果想要添加一个新的方向,只要鼠标放在某一个Item上,在这个Item的右边会有一个加号和一个减号,点击加号增加一个Item,点击减号删除一个Item。

可以随意添加或者删除里面的Item,然后在回到Summary tab中看,Summary tab中的“Supported Device Orientations”会随之改变,这两个地方是保持联动的,其实xxx-Info.plist和Summary tab是同一个东西,只是显示的方法不同,Summary tab使用图形界面控制,xxx-Info.plist使用文字。

3)代码中判断app是否支持某种旋转方向
在BIDViewController.m中,有一个默认的方法叫做shouldAutorotateToInterfaceOrientation

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

当支持某种旋转方向时,返回YES,不支持返回NO,ios为4个旋转方向分别定义了4个常量用来做判断

UIInterfaceOrientationPortrait
UIInterfaceOrientationPortraitUpsideDown
UIInterfaceOrientationLandscapeLeft
UIInterfaceOrientationLandscapeRight

当iphone改变当前的方向时,首先会调用到该方法进行判断,判断app是否支持当前的方向,如果支持返回YES,则继续执行旋转操作,如果不支持,则返回NO,接下来的操作就不继续进行了。(但是这里有个问题,到底是以shouldAutorotateToInterfaceOrientation判断为准还是以Supported Device Orientations中设置的旋转方向为准的?这个在本篇的最后我会去做一个实验验证一下。)

4)添加6个button
选中BIDViewController.xib,如下图添加6个button并命名,6个button分别位于左上、左中、左下、右上、右中、右下
(2种添加按钮的方法:一,一个一个从object library拖进来;二,先从object library中拖进来一个,然后按住option键,鼠标点击一个按钮不放并拖动,就可以复制一个按钮了。)

5)编译运行,测试旋转效果
启动时的默认效果

旋转(选择菜单Hardware->Rotate Left或者command+>)后效果

问题出来了,屏幕旋转后,按钮是旋转了,但是相对位置(相对于屏幕左边和顶部的距离)没有改变,因此除了"UL"button之外,其他所有的button的位置都是不对的,更何况LL和LR两个button不见了!解决这个问题的方法就是是Autosizing。

6)使用Autosize属性
还是选则BIDViewController.xib,然后选中UL按钮,使用快捷键command+5,打开size inspector(就在attributes inspector的右边,你也可以直接用鼠标去选)

从上图中可以看到Autosizing属性是一个由两个正方形组成的图

大的一个正方形表示iphone屏幕的4条边,中间小的正方形表示对象自己,我们选中的是UL按钮,则中间小的正方形就表示UL按钮。然后在小正方形和大正方形之间,有4个“工”,分别表示当前对象距离iphone屏幕4条边的距离是否发生改变,选中表示固定不变(在我们的这个例子中,需要用这个特性来固定按钮的相对位置)。小正方形中间的十字表示是否上下、左右进行拉伸(在我们的这个例子中,这个特性按时不用,不过自己可以试试看)。

(在Autosizing的右边,有一个Example图,当鼠标移动到Autosizing这块区域上时,里面会动态呈现当前对象相对位置状况,方便设置属性。)

根据上面的描述,我们分别设置6个按钮的Autosizing如下

(此图截于pdf,因此不太清晰)
UL:固定左边和上边
UR:固定上边和右边
L:固定左边
R:固定右边
LL:固定左边和下边
LR:固定下边后右边

7)再次编译运行,测试旋转效果
下图是iphone横过来时的效果

所有的按钮都各司其位,达到了我们想要的效果。

Autosize_1

8)问题再次出现
我们好不容易将旋转后按钮位置的问题搞定,新的问题又出现了,我们将6个按钮的大小都设置成125*125(同时选中6个按钮,在Size inspector中设置Width=125,Height=125,然后重新调整6个按钮的位置),如下


编译运行,并旋转屏幕,问题出现了

按钮叠加在了一起,对于这个问题,我们再怎么调整Autosizing属性,都是无法解决的,因为按钮过大,所以在屏幕横过来的时候,无法很好的摆放其位置,解决这个问题的方法是写代码,当iphone旋转时,改变按钮位置。

9)创建Outlet
这个工作应该已经很熟悉了,分别为6个按钮创建Outlet,创建完成后的BIDViewController.h代码如下

#import <UIKit/UIKit.h>

@interface BIDViewController : UIViewController
@property (strong, nonatomic) IBOutlet UIButton *buttonUL;
@property (strong, nonatomic) IBOutlet UIButton *buttonUR;
@property (strong, nonatomic) IBOutlet UIButton *buttonL;
@property (strong, nonatomic) IBOutlet UIButton *buttonR;
@property (strong, nonatomic) IBOutlet UIButton *buttonLL;
@property (strong, nonatomic) IBOutlet UIButton *buttonLR; @end

10)在BIDViewController.m中重载willAnimateRotationToInterfaceOrientation方法
willAnimateRotationToInterfaceOrientation发生在一个旋转发生之后且旋转动画还未发生之前(好吧,旋转的细节我还不是很清楚,但是可知的是,一定有一个事件是发生在旋转开始后还未结束前的,且旋转是有动画的,而这个事件就是发生在旋转开始后,且旋转动画还未开始之前的那段时间里面),会被自动调用。完整code如下

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
if(UIInterfaceOrientationIsPortrait(toInterfaceOrientation))
{
buttonUL.frame = CGRectMake(20, 20, 125, 125);
buttonUR.frame = CGRectMake(175, 20, 125, 125);
buttonL.frame = CGRectMake(20, 168, 125, 125);
buttonR.frame = CGRectMake(175, 168, 125, 125);
buttonLL.frame = CGRectMake(20, 315, 125, 125);
buttonLR.frame = CGRectMake(175, 315, 125, 125);
} else {
buttonUL.frame = CGRectMake(20, 20, 125, 125);
buttonUR.frame = CGRectMake(20, 155, 125, 125);
buttonL.frame = CGRectMake(177, 20, 125, 125);
buttonR.frame = CGRectMake(177, 155, 125, 125);
buttonLL.frame = CGRectMake(328, 20, 125, 125);
buttonLR.frame = CGRectMake(328, 155, 125, 125);
} }

稍微解释一下,frame属性是用来描述当前视图在其父视图中的位置和大小,buttonUL.frame就是用来描述该button在其父视图(View)中的位置和大小,其中位置是CGPoint,大小是CGSize,他们在ios中的声明是这样的

struct CGPoint {
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint; struct CGSize {
CGFloat width;
CGFloat height;
};
typedef struct CGSize CGSize;

很容易理解。在ios中还有一个类型将CGPoint和CGSize组合在一起,这个就是CGRect

struct CGRect {
CGPoint origin;
CGSize size;
};
typedef struct CGRect CGRect;

上面代码中的buttonUL.frame = CGRectMake(20, 20, 125, 125)就是用来设定buttonUL在其父视图(View)中的位置,CGRectMake中前2个参数其实是CGPoint,buttonUL的左上角的起始点,后两个参数其实是CGRect,设定buttonUL的高和宽。

编译运行旋转

当iphone旋转后,6个按钮的位置还是摆放的很合适,good!

11)shouldAutorotateToInterfaceOrientation判断为准还是以Supported Device Orientations判断为准
本篇文章中所有的开发都已经完成,最后对这个遗留问题做一个实验,看看到底是以什么为准,打开BIDViewController.m,修改shouldAutorotateToInterfaceOrientation方法如下

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown
&& interfaceOrientation != UIInterfaceOrientationLandscapeLeft);
}

当interfaceOrientation的方向为UIInterfaceOrientationPortraitUpsideDown或者UIInterfaceOrientationLandscapeLeft,app的视图都不进行改变,然后编译运行程序,效果如下

视图没有变哦,通过实验发现还是以code为准,这个在以后写代码的过程中应该多加留意。

12)总结
这篇内容对iphone的旋转功能有了一个初步的认识,对iphone旋转后,界面的布局有了一个浅显的描述,一般来说有3种方法来改变iphone旋转后界面需要重新布局的问题:

1、使用Autosizing
2、写code
3、重新弄个View,替换原先的View(这个方法下一章会学习)
总的来说这次的内容还是很有用的,每个app都会遇到,除非你的app不支持旋转。

Autosize all

从零开始学ios开发(八):Autorotation and Autosizing的更多相关文章

  1. 从零开始学 iOS 开发的15条建议

    事情困难是事实,再困难的事还是要每天努力去做是更大的事实. 因为我是一路自学过来的,并且公认没什么天赋的前提下,进步得不算太慢,所以有很多打算从零开始的朋友会问我,该怎么学iOS开发.跟粉丝群的朋友交 ...

  2. 从零开始学IOS开发

    从今天开始开一个坑,由于业务变动,要开始学习IOS开发进行IOS app开发,其实鄙人本身就是一只菜鸟加大学狗,有过两年的C#,ASP.NET MVC,微信公众平台开发经验,一只在继续努力着,从大三下 ...

  3. 从零开始学ios开发(三):第一个有交互的app

    感谢大家的关注,也给我一份动力,让我继续前进.有了自己的家庭有了孩子,过着上有老下有小的生活,能够挤出点时间学习真的很难,每天弄好孩子睡觉已经是晚上10点左右了,然后再弄自己的事情,一转眼很快就到12 ...

  4. 从零开始学ios开发(一):准备起航

    首先介绍一下自己的背景,本人09年研究生毕业,大学就不介绍了,反正是上海的一所211大学,学的是计算机科学与技术专业,学生时代,从事过ACM,没有什么太大的成就,中国的牛人是在太多,我的水平,估计连高 ...

  5. 从零开始学ios开发(十八):Storyboards(下)

    这篇我们完成Storyboards的最后一个例子,之前的例子中没有view之间的切换,这篇加上这个功能,使Storyboards的功能完整呈现.在Storyboards中负责view切换的东西叫做“s ...

  6. 从零开始学ios开发(四):IOS控件(1),Image View、Text Field、Keyboard

    长话短说,谢谢大家的关注,这篇写了好长时间,下面继续学习ios.我将用2到3篇的篇幅来学习iphone上的一些常用控件,包括Image View.Text Field.Keyboard.Slider等 ...

  7. 从零开始学ios开发(七):Delegate,Action Sheet, Alert

    Action Sheet和Alert是2种特殊的控件(暂且称之为控件吧,其实不是控件真正的控件,而是ios中的2个类,这2个类定义了2种不同类型的用于和用户交互的弹出框),Action Sheet是从 ...

  8. 从零开始学ios开发(二十):Application Settings and User Defaults(下)

    在上一篇的学习中,我们知道了如何为一个App添加它的Settings设置项,在Settings设置项中我们可以添加哪些类型的控件,这些控件都是通过一个plist来进行管理的,我们只需对plist进行修 ...

  9. 从零开始学ios开发(十九):Application Settings and User Defaults(上)

    在iphone和ipad中,有一个东西大家一定很熟悉,那个东西就是Settings. 这次要学习的东西说白了很简单,就是学习如何在Settings中对一个app的某些属性进行设置,反过来,在app中更 ...

随机推荐

  1. poj 3621 0/1分数规划求最优比率生成环

    思路:以val[u]-ans*edge[i].len最为边权,判断是否有正环存在,若有,那么就是ans小了.否则就是大了. 在spfa判环时,先将所有点进队列. #include<iostrea ...

  2. SQL server 2008 建立新用户

    进入Instance下的‘安全性’->登录名, 可以选择SQL server 验证,‘强制实施密码策略’.’状态‘ 为启用. 在使用的数据库下‘安全性’->登录名,选择‘登录名’,输入之前 ...

  3. 用jquery 实现 超出字符 截断加上省略号并且可以提示全部内容

    1.test.jsp Java代码 <%@ page language="java" pageEncoding="UTF-8"%> <html ...

  4. 苹果宣布首批HomeKit智能家居设备将在6月上市

    凤凰科技讯 北京时间5月15日消息,据<华尔街日报>网络版报道,苹果周四宣布,首批支持其HomeKit平台的智能家居设备将在下月上市.这一消息的发布也驳斥了关于该苹果家庭自动化软件平台将推 ...

  5. MVC基础知识-持续更新....

    1.如何在自动生成的视图中显示需要的字段名称: 在相应的定义字段中添加Display,例如: [Display(Name = "用户名:")] public string User ...

  6. GitHub之创建

    O(∩_∩)O~ 爱“搞事”的我又创了一个Github账号,和当初加入博客园的初衷一样,为了广泛交流和学习而已.很久之前我就发现了有很多人都在使用GitHub,然而当时看不懂英文(绝大部分都是英文), ...

  7. android sdk manager 无法更新

    1.在C:\Windows\System32\drivers\etc找到Hosts文件用记事本打开,在最末尾添加如下代码,保存关闭: #Google主页203.208.46.146 www.googl ...

  8. javascript中的闭包。

    function todo() { var var1 = 1; (function () { var var2 = var1 + 1; alert(var2); })(); } todo(); (fu ...

  9. 二叉树-你必须要懂!(二叉树相关算法实现-iOS)

    这几天详细了解了下二叉树的相关算法,原因是看了唐boy的一篇博客(你会翻转二叉树吗?),还有一篇关于百度的校园招聘面试经历,深刻体会到二叉树的重要性.于是乎,从网上收集并整理了一些关于二叉树的资料,及 ...

  10. OpenJudge 666:放苹果

    总时间限制: 1000ms 内存限制: 65536kB 描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. 输 ...