iOS小知识点10(获取手机横竖屏状态的几种方式)

项目需求需要知道手机当前是竖屏还是横屏状态,于是谷歌了一下,归纳如下:


方式一:注册手机方向改变的通知UIDeviceOrientationDidChangeNotification

- (void)viewDidLoad {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doRotateAction:) name:UIDeviceOrientationDidChangeNotification object:nil];
}

- (void)doRotateAction:(NSNotification *)notification {
    if ([[UIDevice currentDevice] orientation] == UIDeviceOrientationPortrait || [[UIDevice currentDevice] orientation] == UIDeviceOrientationPortraitUpsideDown) {
      NSLog(@"竖屏");
    } else if ([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeLeft || [[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeRight) {
      NSLog(@"横屏");
    }
}

Notice:在手机开启竖排方向锁定时,上述方法无效。


为了解决即使在手机开启竖排方向锁定时,仍然能知道手机是竖向还是横向的问题,在Stack Overflow 网站上找到了一些解决方式。
下面两种方式都是使用加速计。

  • 加速计的原理


    加速计的原理
    • 检测设备在x,y,z轴上的加速度(加速度范围为-1 ~ 1)。
    • 根据加速度的数值,判断手机屏幕方向。
根据不同的值来区分手机朝向

方式二:iOS5之前,采用UIAccelerometer类(加速计) -- 已过期

  - (void)viewDidLoad {
    [super viewDidLoad];
    // 获取单例对象
    UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer];
    // 设置代理 
    accelerometer.delegate = self; // 遵守UIAccelerometerDelegate协议
    // 设置采样间隔 一秒采集60次
    accelerometer.updateInterval = 1 / 60.0;
}

// UIAccelerometerDelegate 协议唯一的回调方法
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
    NSLog(@"x加速度%f -- y加速度%f -- z加速度%f", acceleration.x, acceleration.y, acceleration.z);
  // 根据 acceleration.x, acceleration.y, acceleration.z 来区分手机横竖屏状态
}

方式三:iOS5之后,采用

  • 导入库
  • 同样使用加速计
- (void)viewDidLoad {
    [super viewDidLoad];

    CMMotionManager *motionManager = [[CMMotionManager alloc] init];
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    // 加速计
    if (motionManager.accelerometerAvailable) {
      motionManager.accelerometerUpdateInterval = 1;
      [motionManager startAccelerometerUpdatesToQueue:queue withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
          if (error) {
              [motionManager stopAccelerometerUpdates];
              NSLog(@"error");
          } else {
              NSLog(@"x 加速度--> %f\n y 加速度--> %f\n z 加速度--> %f\n", accelerometerData.acceleration.x, accelerometerData.acceleration.y, accelerometerData.acceleration.z);
              // 根据 accelerometerData.acceleration.x/y/z来区分手机横竖屏状态。
      }];
  } else {
      NSLog(@"This device has no accelerometer");
  }
}

你可能感兴趣的:(iOS小知识点10(获取手机横竖屏状态的几种方式))