我们都知道,在iPhone/iPad应用程序开发中会涉及到旋转问题,当然,旋转问题的处理在某方面来说是比较烦的工作,这倒不是因为有多复杂,只是不太好控制。特别时xib和代码同时进行操作将会使问题更加复杂话。所以在进行旋转处理时的第一点建议就时尽量采取xib或者代码操作中的一种,不到万不得已就不要两种方式同时使用了。当然其实对与这样的事情是没什么万不得已的。
旋转控制的第一步就是必须要让你的应用支持旋转功能,为了保证自己的代码能够支持旋转,我们必须首先处理一个函数:
- (BOOL)shouldAutorotatetoInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return YES;
}
这个函数时用来确定我们的应用所支持的旋转方向。如果想要支持每个方向则直接返回YES就行。完成了这一步,我们就可以根据所支持的方向来处理旋转问题了。这里我们首先来看看可以用来支持旋转的函数:
-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
}
-(void)willAnimateFirstHalfOfRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
}
-(void)willAnimateSecondHalfOfRotationFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation duration:(NSTimeInterval)duration {
}
-(void)willRotatetoInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
}
-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
}
-(void)didAnimateFirstHalfOfRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
}
这些函数,都可以用来支持旋转,当然这些旋转函数中存在这一定的相互制约关系,亦即有些旋转函数是不能同时存在的(这只是我在做的过程中所遇到的,具体怎样一种制约关系这里就不说了)。
接下来就我们将开始旋转处理的问题了,在具体到每一个函数之前,先说一个问题,就是关于各种view的自动适应问题,前面说过尽量保证不要在xib和代码中同时处理,这里还要说一下,如果要手动控制位置的话也不要通过代码设置自适应大小,如果这样可能会导致支持旋转的函数在设置好位置后有因为自适应而再次对大小进行调整而造成不可控制。
-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
}
这个函数,执行在旋转方向发生改变时,但有个问题,自己多次对这个函数进行测试,其frame都是以竖屏方式,只是他的statusBarOrientation的方向发生了变化。其方向与将要旋转到的方向时保持一致的。
对于其他的函数自己可以通过输出statusBarOrientation和frame的方式来获知其执行时间当然还可以和其他几个支持旋转的函数一起配合着使用来知道其执行顺序。
下面该说说对旋转的处理了,由于每个支持旋转的函数在其执行是的方向和frame的不同我们就必须根据我们的需要来确定了,甚至在某些函数下不能通过self.view的frame的参数值来设置,因为在旋转过程中self.view的frame值是不可靠的。所以我们可以通过设置定值的方式来处理,但是这种方式并不方便。不过对于特定的处理是比较可靠的。
对于要处理的东西特别多的我们可以通过继承的方式来实现,通过把子view放在继承中实现,并通过在子view中实现layoutSubviews函数来实现旋转后的位置布局是比较好的。但是这里要说明,如果我们要是调整的位置可控建议不要在使用继承下来的类中对该类的view使用自适应方式,而通过在旋转的函数中来设置其frame的大小,这样就可以保证在我们自定义类的对向在我们想要的时刻来调整他的frame。若时设置了只适应大小,这将导致我们layoutSubviews函数并不一定时在我们调整了他的frame之后才执行,而是在它通过自适应方式调整了大小之后就执行。