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