自动旋转机制:
并不是所有的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中被删除了
不同的方向,采用不同的视图
输出口集合。。。