指定旋转支持
在xcode中一个基于视图的应用程序中,模板会提供一个名为shouldAutorotateToInterfaceOrientation:的方法。
如下所示:
- (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation == UIInterfaceOrientationPortrait);}
系统能过调用此方法询问视图控制器是否应该旋转到指定方向。系统共定义了4种文献,分别对应气质iphone的4种常见
方式:
UIInterfaceOrientationPortrait
UIInterfaceOrientationPortraitUpsideDown
UIInterfaceOrientationLandscapeLeft
UIInterfaceOrientationLandscapeRight
当电话的方向发生更改时,系统将调用此方法来损伤视图控制器。interfaceOritentation参数将包含上上述4个值之一,并且此方法需要返回YES或NO,以指示是否应该旋转应用程序的容器以匹配新的方向。
使用自动调整属性设计界面
在xcode中,展开resource文件夹,双击项目xib文件,在Interface Builder中打开该文件。使用自动调整属性的一个好处在于,
它们需要的代码极少。当然事先我们必须要指定支持的方向,之后实现此技术所需的其他所有工作将在Interface Builder中完成。
可以看xcode中的show the size inspector,Autosizing一栏就是用来配置此功能的。
左侧是设置对象可自动调整属性的方向,内部的正方形表示当前的对象,其中的红色箭头表示选定对象内部的水平和垂直空间。
单击做生意箭头都可将其由实线变为虚线(实线表示可自由更改,虚线表示尽量保持为原始值)。
正方形外部的4个相红色实线表示对象与其它视图的边距(实线表示尽可能不变,虚线表示可变)。
所以只要适当的设置好线的虚实,就可以达到对象自动调整布局的效果。
当然,有的时候,上面的设置也没法使用对象在旋转后仍然保持很好的布局,这时候就要使用代码来调整,
在旋转的时候重构视图。
示例代码如下:
- (void)willAnimateSecondHalfOfRotationFromInterfaceOrientation: (UIInterfaceOrientation)fromInterfaceOrientation duration:(NSTimeInterval)duration { UIInterfaceOrientation interfaceOrientation = self.interfaceOrientation; if (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == 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); }}
项目中覆盖了willAnimateSecondHalfOfRotationFromInterfaceOrientation:duration:方法。此方法将在旋转开始之后,最后的旋转动画发生之前自动调用。
还有一个名为willAnimateFirstHalfOfRotationFromInterfaceOrientation:duration的方法,该方法中的更改将在旋转动画发生
之前完成,该方法是专为应该在旋转动画完全完成之前发生的更改而设计的。在本例中,我们需要按钮在旋转完成的同时移动到它们的新位置,这已经我们选择second-half方法的原因。
切换视图
还可以通过另一种方式来处理自动旋转,这种方式可能仅适用于非常复杂的界面。
简章解释一下:
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration { if (interfaceOrientation == UIInterfaceOrientationPortrait) { self.view = self.portrait; self.view.transform = CGAffineTransformIdentity; self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(0)); self.view.bounds = CGRectMake(0.0, 0.0, 300.0, 480.0); } else if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft) { self.view = self.landscape; self.view.transform = CGAffineTransformIdentity; self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(-90)); self.view.bounds = CGRectMake(0.0, 0.0, 460.0, 320.0); } else if (interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) { self.view = self.portrait; self.view.transform = CGAffineTransformIdentity; self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(180)); self.view.bounds = CGRectMake(0.0, 0.0, 300.0, 480.0); } else if (interfaceOrientation == UIInterfaceOrientationLandscapeRight) { self.view = self.landscape; self.view.transform = CGAffineTransformIdentity; self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90)); self.view.bounds = CGRectMake(0.0, 0.0, 460.0, 320.0); }}
从上面的代码里应该可以看出来,就是在旋转到不同方向的时候加载不同的view,达到自动调整的效果。
有时候需要设置程序启动时的orientaion,可以在程序的info.plist文件里新建一行,key设置为intial interface orientation,然后设置orientation的值,
这样当程序启动时,就是设置好的orientation。