项目需求需要知道手机当前是竖屏还是横屏状态,于是谷歌了一下,归纳如下:
方式一:注册手机方向改变的通知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"); }}