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

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

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

- (void)viewDidLoad {    [[NSNotificationCenterdefaultCenter] addObserver:selfselector:@selector(doRotateAction:) name:UIDeviceOrientationDidChangeNotificationobject:nil];}- (void)doRotateAction:(NSNotification*)notification {if([[UIDevicecurrentDevice] orientation] ==UIDeviceOrientationPortrait|| [[UIDevicecurrentDevice] orientation] ==UIDeviceOrientationPortraitUpsideDown) {NSLog(@"竖屏");    }elseif([[UIDevicecurrentDevice] orientation] ==UIDeviceOrientationLandscapeLeft|| [[UIDevicecurrentDevice] orientation] ==UIDeviceOrientationLandscapeRight) {NSLog(@"横屏");    }}

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

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

下面两种方式都是使用加速计。

加速计的原理

iOS小知识点10(获取手机横竖屏状态的几种方式)_第1张图片

加速计的原理

检测设备在x,y,z轴上的加速度(加速度范围为-1 ~ 1)。

根据加速度的数值,判断手机屏幕方向。

iOS小知识点10(获取手机横竖屏状态的几种方式)_第2张图片

根据不同的值来区分手机朝向

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

- (void)viewDidLoad {    [superviewDidLoad];// 获取单例对象UIAccelerometer*accelerometer = [UIAccelerometersharedAccelerometer];// 设置代理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 {    [superviewDidLoad];CMMotionManager*motionManager = [[CMMotionManageralloc] init];NSOperationQueue*queue = [[NSOperationQueuealloc] 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(获取手机横竖屏状态的几种方式))