iOS 屏幕旋转处理
在 iOS 设备上, 屏幕旋转是个挺坑比的问题. 苹果希望 app 对整个 app 做统一的旋转处理, 而没有提供单独页面的旋转方案.
对于单独页面需要旋转的情况下, 最好使用 Model 弹出 ViewController, 这样 Application 不需要对当前 Application 的所有 Model 中的根控制器进行询问.
-
Application 启动初始化(根据 plist 来设置 OrientationMask)
-
询问 AppDelegate 当前 App 所支持的 OrientationMask
AppDegete 中 application:supportedInterfaceOrientationsForWindow: 方法
-
如果是通过 Model 弹出的 ViewController, 则询问当前 ModelViewController 所偏好的 Orientation, 否则执行第4步:
ModelViewController 中的
preferredInterfaceOrientationForPresentation 方法 -
查看当前 App 屏幕上层 RootViewController 所支持的 Orientations
该 ViewController 中的
supportedInterfaceOrientations 方法
对比当前控制器所支持的方向, 并与 App 所支持的方向对比
相交有值则继续进行, 相交无值则抛出异常 -
根据当前的重力方向, 在屏幕旋转时询问 RootViewController 是否需要旋转
即控制器的
shouldAutorotate 方法, 返回 YES 则进行对应旋转, 返回 NO 则不旋转
但这种情况下, 执行 Push Pop 操作 NavgationController 或者切换 TabbarController 时, 并不会通知系统进行回调(只有在 Model Present
操作或者 旋转手机物理方向
时才会). 因此在执行此类操作时, 需要手动强迫系统调用回调.
但实际上系统没有提供这个方法, 目前仅能通过 KVC 设置系统的 Orientation 并告知系统去调用这些回调.
NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeLeft];
[[UIDevice currentDevice] setValue:value forKey:@"orientation"];
[UIViewController attemptRotationToDeviceOrientation];
网友评论