iOS 屏幕旋转处理

iOS 屏幕旋转处理

在 iOS 设备上, 屏幕旋转是个挺坑比的问题. 苹果希望 app 对整个 app 做统一的旋转处理, 而没有提供单独页面的旋转方案.
对于单独页面需要旋转的情况下, 最好使用 Model 弹出 ViewController, 这样 Application 不需要对当前 Application 的所有 Model 中的根控制器进行询问.

  1. Application 启动初始化(根据 plist 来设置 OrientationMask)

  2. 询问 AppDelegate 当前 App 所支持的 OrientationMask

    AppDegete 中 application:supportedInterfaceOrientationsForWindow: 方法

  3. 如果是通过 Model 弹出的 ViewController, 则询问当前 ModelViewController 所偏好的 Orientation, 否则执行第4步:

    ModelViewController 中的
    preferredInterfaceOrientationForPresentation 方法

  4. 查看当前 App 屏幕上层 RootViewController 所支持的 Orientations

    该 ViewController 中的
    supportedInterfaceOrientations 方法
    对比当前控制器所支持的方向, 并与 App 所支持的方向对比
    相交有值则继续进行, 相交无值则抛出异常

  5. 根据当前的重力方向, 在屏幕旋转时询问 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];
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,018评论 25 708
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,198评论 4 61
  • 春节过完,我要回城工作了,妈妈化疗不能出外面,怕感冒。爸爸送我去车站,顺便到姑姑家,看看老姑。 阳光灿烂,蓝天白云...
    华客鲁俊阅读 292评论 4 8
  • 前两天我们六个人的微信群被Z要结婚的消息炸活了,沉寂了好几个月的群突然变得热闹非凡,有人问什么时候办婚礼,有人问房...
    花未全阅读 563评论 0 2
  • “哎呀,美女,你可别试啊,这鞋子没有你的码,你可别把鞋子给挤破了”店员大声嚷嚷着,用着嫌弃和惊慌的表情对(女主)说...
    心机胖娃阅读 131评论 0 0