第05章 自动旋转和自动调整大小

自动旋转机制:

并不是所有的iphone都需要支持所有方向。不过apple建议,所有的ipad app都支持所有方向。

iphone4为 320*480

iphone5 用点为单位的话,大小为 320*568,Retina屏幕一个点为4个像素

ipad为 768*1024个点

所有的状态栏(顶部显示信号强度,时间,电量等)为20个点

自动旋转的实现方式:

1.为控件定义约束,使得在不同的视图内,控制自己的位置

2.视图调整时,在代码中手动调整视图内对象的位置

3.在IB中,为视图设计两个不同的版本,一个用于横屏,一个用于竖屏

要告诉IOS,我们视图支持的旋转,有两中方式:

1.全局的,将会影响app所有视图

模拟器中左右旋转设备的快捷键

command+左方向键,command+右方向键

窗口布局

状态栏20点

状态栏下,左上角(0,0)位置

|

|

|

|

————最右下角320,548,注意,是548,因为状态栏占有了20个点

2.私有的,全局设置的子集,即如果全局设置不支持横向,则私有的设置了也没用。

UIViewController

- (NSUInteger) supportedInterfaceOrientations

{

return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft;

}

技巧:快速注释程序快 conmand+/

注意,UIInterfaceOrientationMaskLandscapeLeft: 旋转后,左边缘朝上的方向。

常用组合

UIInterfaceOrientationMaskAll

UIInterfaceOrientationMaskAllButUpsideDown

UIInterfaceOrientationMaskLandscape

使用约束设计界面

 顶部空白

前置空白

 底部空白

 后置空白

IB自动创建约束

对象拖动到View边缘,对象拖动到临近对象等。。

以上这种约束,不能保证在横向时候在中间,需要使用Editor-》Align-》Vertical Center in Container 建立竖向中间约束。

手动约束创建,注意,手动建立出来的约束是粗线,可删除。

Pin菜单

Width 固定宽度

Height 固定高度

Leading To Superview 建立到左边约束

Trailing Space To Superview 建立到右边约束

Top Space To Superview 建立到顶部约束

Bottom Space To Superview 建立到底部约束

Horizontal Spacing 固定控件间水平间距

Vertical Spacing 固定控件间垂直间距

Widths Equally 所选控件宽度相等

Height Equally 所选控件高度相等

Align菜单

Horizontal Center in Container 水平中间

Vertical Center in Container  竖直中间

旋转时,用代码重构视图

使用代码控制控件位置的时候,首先要做的就是禁用掉xib文件的autoLayout功能

打开xib文件的文件检查器,勾选掉

视图旋转开始前,会调用此方法,重载之

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

这样,来修改控件的大小和位置,不同的方向,不同的设置

_bigButton.frame = CGRectMake(20,20,280,280);

viewDidLoad中,第一次显示的时候,也需要设置

- (void)viewDidLoad

{

[super viewDidLoad];

UIApplication *application = [UIApplication sharedApplication];

//通过应用程序状态栏的方法,获知app窗口的方向

UIInterfaceOrientation curOrientation = [application statusBarOrientation];

[self doLayOutForOrientation:curOrientation];

}

获取屏幕方向改变的不同方法:

1.添加controller为UIDeviceOrientationDidChangeNotification通知的观察者(addObserver)

2.直接使用viewWillLayoutSubviews

viewWillLayoutSubviews和 willAnimateRotationToInterfaceOrientation:duration:除了很显然的不同之外,还有一点不同,

前者仅 仅是在横向变为纵向或纵向变为横向时候调用,而后者是四个方向都会调用。

PS:一般只用前者即可,因为在横向变为横向或纵向变为纵向的时候,并不需要手动 布局界面。

它们的另一个区别是:当需要重新布局的时候,调用前者;仅仅当屏幕旋转的时候才调用后者,初始启动不会调用后者。

其实直接使用viewWillLayoutSubviews,还不用改写viewDidLoad

willAnimateRotationToInterfaceOrientation:duration 在IOS8中被删除了

不同的方向,采用不同的视图

输出口集合。。。

时间: 2024-10-29 00:52:59

第05章 自动旋转和自动调整大小的相关文章

iOS_book03 -自动旋转、自动调整大小、尺寸分类器

自动旋转(autorotation):支持在纵向模式(长而窄)或横向模式(短而宽)下使用应用程序,支持在旋转设备时更改应用程序的方向. 苹果公司建议iPad上的大部分应用程序都应该支持所有的方向. 对于iPhone应用,基本原则是:如果自动旋转能够增强用户体验,就应该将它们添加到应用中.对于iPad应用,添加自动旋转功能是一项铁则. 注意:如果应用程序显示了状态栏,则垂直屏幕上程序实际可用的空间将在垂直方向上减少20点.状态栏位于屏幕顶部,高度为20点,用于显示信号强度.时间以及电池电量等信息.

自动旋转屏幕默认旋转

如下图所示,在处理屏幕默认旋转方向的时候可以在这里进行选择,上下左右一共是4个方向. 策划的需求是游戏采用横屏,但是要求支持两个方向自动旋转,如下图所示,我的设置是这样的.Default Orientation* Auto Roation 表示游戏支持自动旋转屏幕,但是前提是手机没有锁定屏幕旋转功能.Landscape Right 和Landscape Left 表示手机屏幕只支持横屏两个方向的自动旋转. <ignore_js_op> 这里问题就来了,既然设置了两个方向的自动旋转,那么必然会有

iOS6 及其以上版本自动旋转、手动强制旋转方案及布局适配

1.布局适配方式 本文不讨论哪种布局适配方式最好,此处使用的是 Masonry 纯代码布局适配.(Masonry 底层就是 AutoLayout 的 NSLayoutConstraint) 2.iOS 方向枚举类 // 三维设备方向 typedef NS_ENUM(NSInteger, UIDeviceOrientation) { UIDeviceOrientationUnknown, UIDeviceOrientationPortrait, // Device oriented vertica

Androidの解决自动旋转导致activity重启问题

记录一下,经常在新建项目的时候就会发生这个问题,正好上次有个群友也问道了这个问题.就是设备屏幕打开自动旋转会导致activity重启,这样会消耗很多资源. 比如在加载listview数据会重新请求数据,当播放音乐时会异常停止等.android没有像ios那样自动处理这个问题,要我们自己到manifest增加这个属性值, android:configChanges="orientation|screenSize" ,这样就可以了,一定要这两个值少一个都不行,而且不能写错哦,像我这次就把n

iOS开发- 相机(摄像头)获取到的图片自动旋转90度解决办法

http://www.tuicool.com/articles/IfEZre 今天写demo的时候发现, 如果把通过相机获取到的图片,直接进行操作, 比如裁剪, 缩放, 则会把原图片向又旋转90度. 刚开始觉得莫名其妙, 不知所措. 后来百度了一下,找到了解决办法. ps: 查找过程中, 碰到了一种说法: //get original photo from iOS photos //如果该图片大于2M,会自动旋转90度:否则不旋转 UIImage* originalImg=[dict objec

Phonegap 禁止手机横屏竖屏自动旋转

方法: 在AndroidManifest.xml的<activity>标签里面加入下面代码 android:screenOrientation=”portrait”属性即可(portrait是纵向,landscape是横向),事例代码如下: <activity android:name="com.example.test.MainActivity" android:label="@string/app_name" android:screenOri

IOS6屏幕旋转详解(自动旋转、手动旋转、兼容IOS6之前系统)

IOS6屏幕旋转详解(自动旋转.手动旋转.兼容IOS6之前系统) 转自:http://blog.csdn.net/cococoolwhj/article/details/8208991 概述: 在iOS6之前的版本中,通常使用 shouldAutorotateToInterfaceOrientation 来单独控制某个UIViewController的方向,需要哪个viewController支持旋转,只需要重写shouldAutorotateToInterfaceOrientation方法.

设置Windows 8.1屏幕自动旋转代码, Auto-rotate function code

程序代码实现启用或禁用Windows 8.1 Tablet的自动旋转功能 方法一:使用SetDisplayAutoRotationPreferences函数功能 #include <Windows.h> /* typedef enum ORIENTATION_PREFERENCE { ORIENTATION_PREFERENCE_NONE = 0x0, ORIENTATION_PREFERENCE_LANDSCAPE = 0x1, ORIENTATION_PREFERENCE_PORTRAIT

IOS某个ViewController禁止自动旋转

IOS屏幕自动旋转,强制横竖屏方法: - (BOOL)shouldAutorotate { return YES; } - (NSUInteger)supportedInterfaceOrientations { return (UIInterfaceOrientationMaskAll);// 修改这里 控制显示方向 } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrienta