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

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

作者: 早起的虫儿子被鸟吃 | 来源:发表于2017-06-12 15:38 被阅读0次

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

    方式一:注册手机方向改变的通知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网站上找到了一些解决方式。

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

    加速计的原理

    加速计的原理

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

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

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

    方式二: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(获取手机横竖屏状态的几种方式)

          本文链接:https://www.haomeiwen.com/subject/hovlqxtx.html