指定旋转支持

 

在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。