您的位置:首页 > 移动开发 > IOS开发

iOS Interface Orientation

2014-09-18 22:36 429 查看
获得当前屏幕方向

self.interfaceOrientation或[[UIApplication sharedApplication] statusBarOrientation]
 if (self.interfaceOrientation==UIDeviceOrientationLandscapeRight)
{
XXOO
}
不旋转,保持竖屏



始终保持横屏



在使用UINavigationController时发现,无论怎么设置上面方法的返回,都无法控制UINavigationController的旋转,这似乎是iOS的一个bug。但无论如何,以下是stackflow上面的一个解决方法

1 @implementation UINavigationController (Rotation_IOS6)
2 -(BOOL)shouldAutorotate {
3     return [[self.viewControllers lastObject] shouldAutorotate];
4 }
5
6 -(NSUInteger)supportedInterfaceOrientations {
7     return [[self.viewControllers lastObject] supportedInterfaceOrientations];
8 }
9
10 - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
11     return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
12 }
13 @end


屏幕旋转方法调用流程

要翻转的时候,首先响应的方法:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

return YES则支持翻转,NO则不支持。

紧接着

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

被调用。这个方法是发生在翻转开始之前。一般用来禁用某些控件或者停止某些正在进行的活动,比如停止视频播放。

再来是

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

这个方法发生在翻转的过程中,一般用来定制翻转后各个控件的位置、大小等。可以用另外两个方法来代替:willAnimateFirstHalfOfRotationToInterfaceOrientation:duration:   和  willAnimateSecondHalfOfRotationFromInterfaceOrientation:duration:

最后调用的是

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation

这个方法发生在整个翻转完成之后。一般用来重新启用某些控件或者继续翻转之前被暂停的活动,比如继续视频播放
博文出自:http://blog.csdn.net/wudizhukk/article/details/8674393

屏幕旋转学习笔记
 
  加速计是整个IOS屏幕旋转的基础,依赖加速计,设备才可以判断出当前的设备方向,IOS系统共定义了以下七种设备方向:

typedefNS_ENUM(NSInteger, UIDeviceOrientation) {
    UIDeviceOrientationUnknown,
    UIDeviceOrientationPortrait,           // Device oriented vertically, home button on the bottom
    UIDeviceOrientationPortraitUpsideDown, // Device oriented vertically, home button on the top
    UIDeviceOrientationLandscapeLeft,      // Device oriented horizontally, home button on the right
    UIDeviceOrientationLandscapeRight,     // Device oriented horizontally, home button on the left
    UIDeviceOrientationFaceUp,             // Device oriented flat, face up
    UIDeviceOrientationFaceDown            // Device oriented flat, face down
};
   以及如下四种界面方向:
typedefNS_ENUM(NSInteger, UIInterfaceOrientation) {
    UIInterfaceOrientationPortrait           =UIDeviceOrientationPortrait,
    UIInterfaceOrientationPortraitUpsideDown =UIDeviceOrientationPortraitUpsideDown,
    UIInterfaceOrientationLandscapeLeft      =UIDeviceOrientationLandscapeRight,
    UIInterfaceOrientationLandscapeRight     =UIDeviceOrientationLandscapeLeft
};
 
一、UIKit处理屏幕旋转的流程 
  当加速计检测到方向变化的时候,会发出 UIDeviceOrientationDidChangeNotification 通知,这样任何关心方向变化的view都可以通过注册该通知,在设备方向变化的时候做出相应的响应。上一篇博客中,我们已经提到了在屏幕旋转的时候,UIKit帮助我们做了很多事情,方便我们完成屏幕旋转。
  UIKit的相应屏幕旋转的流程如下:
1、设备旋转的时候,UIKit接收到旋转事件。
2、UIKit通过AppDelegate通知当前程序的window。
3、Window会知会它的rootViewController,判断该view controller所支持的旋转方向,完成旋转。
4、如果存在弹出的view controller的话,系统则会根据弹出的view controller,来判断是否要进行旋转。
 
二、UIViewController实现屏幕旋转
  在响应设备旋转时,我们可以通过UIViewController的方法实现更细粒度的控制,当view controller接收到window传来的方向变化的时候,流程如下:
1、首先判断当前viewController是否支持旋转到目标方向,如果支持的话进入流程2,否则此次旋转流程直接结束。
2、调用 
willRotateToInterfaceOrientation:duration: 
方法,通知view
controller将要旋转到目标方向。如果该viewController是一个container view controller的话,它会继续调用其content view controller的该方法。这个时候我们也可以暂时将一些view隐藏掉,等旋转结束以后在现实出来。
3、window调整显示的view controller的bounds,由于view controller的bounds发生变化,将会触发 
viewWillLayoutSubviews 方法。这个时候
self.interfaceOrientationstatusBarOrientation方向还是原来的方向。
4、接着当前view controller的 
willAnimateRotationToInterfaceOrientation:duration:
 方法将会被调用。系统将会把该方法中执行的所有属性变化放到动animation
block中。
5、执行方向旋转的动画。
6、最后调用 
didRotateFromInterfaceOrientation:
 方法,通知view
controller旋转动画执行完毕。这个时候我们可以将第二部隐藏的view再显示出来。
  整个响应过程如下图所示:



  
  以上就是UIKit下一个完整的屏幕旋转流程,我们只需要按照提示做出相应的处理就可以完美的支持屏幕旋转。
 
三、注意事项和建议
  1)注意事项
  当我们的view controller隐藏的时候,设备方向也可能发生变化。例如view Controller A弹出一个全屏的view controller B的时候,由于A完全不可见,所以就接收不到屏幕旋转消息。这个时候如果屏幕方向发生变化,再dismiss B的时候,A的方向就会不正确。我们可以通过在view
controller A的viewWillAppear中更新方向来修正这个问题。
  2)屏幕旋转时的一些建议
在旋转过程中,暂时界面操作的响应。
旋转前后,尽量当前显示的位置不变。
对于view层级比较复杂的时候,为了提高效率在旋转开始前使用截图替换当前的view层级,旋转结束后再将原view层级替换回来。
在旋转后最好强制reload tableview,保证在方向变化以后,新的row能够充满全屏。例如对于有些照片展示界面,竖屏只显示一列,但是横屏的时候显示列表界面,这个时候一个界面就会显示更多的元素,此时reload内容就是很有必要的。
博文出处:http://www.cnblogs.com/smileEvday/archive/2013/04/24/Rotate2.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Interface Orientation