iOS开发记录iOS学习开发

iOS屏幕旋转与锁屏

2018-07-11  本文已影响95人  千江月_Chen

在做视频开发时遇到屏幕旋转问题,其中涉及到 StatusBar、 UINavigationController、UITabBarController 、UIViewcontroller

在设备锁屏下的整体效果图

iOS-旋转.gif

主要涉及以下4点:

1、横竖屏旋转

代码中通过 -(UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 方法将控制器交给自己控制,该方法默认值为Info.plist中配置的Supported interface orientations项的值。

2、屏幕旋转相应改变视图位置

这里先扩展UIDeviceOrientation & UIInterfaceOrientation的知识

由上可以发现:

  1. iOS 6 及之后版本使用的UIInterfaceOrientationMask类型来控制屏幕屏幕方向,该类型也新增加了几个枚举取值,可用一个枚举取值来代表多个屏幕方向,使用起来更方便。
  2. 注意在UIInterfaceOrientation中有注释 Note that UIInterfaceOrientationLandscapeLeft is equal to UIDeviceOrientationLandscapeRight (and vice versa).
    This is because rotating the device to the left requires rotating the content to the right
    ,大意是界面的左转相当于设备的右转,如果设备向左转时就需要内容(即界面)向右转。即:
    UIInterfaceOrientationLandscapeLeft = UIDeviceOrientationLandscapeRight
    UIInterfaceOrientationLandscapeRight = UIDeviceOrientationLandscapeLeft
    下面还会举例说明。

其实UIDeviceOrientationUIInterfaceOrientation是两个互不相干的属性,通常情况下会一起出现,在这里正好利用此特性在屏幕旋转后进行重新布局。

例如:竖屏转横屏
界面竖屏UIInterfaceOrientationPortrait ->横屏UIInterfaceOrientationLandscapeRight,设备方向UIDeviceOrientationPortrait->UIDeviceOrientationLandscapeLeft,在设备发生变化这个过程触发UIDeviceOrientationDidChangeNotification监听,然后进行重新布局。

3、旋转时状态栏的隐藏与显示

4、锁屏

锁屏时,不管系统锁屏是否关闭、Push 或 Present 返回后,界面依然保持不变。

5、 针对特定UIViewController方向的支持

-(UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
 
      if ([NSStringFromClass([[self topViewController] class]) isEqualToString:@"FirstViewController"]) {
          //横屏
          return UIInterfaceOrientationMaskLandscapeRight;
      }
      //竖屏
      return UIInterfaceOrientationMaskPortrait;
  }

最后的献上GitHub代码,还有2个小的 bug ,有兴趣的朋友欢迎来探讨。

上一篇下一篇

猜你喜欢

热点阅读