设备方向是指设备的物理方向。viewcontroller的方向指界面的viewcontroller方向,一般与statusbar的方向一致。view的方向一般与viewcontroller方向一致,但是可以对view作出变换,使得视图方向与viewcontroller方向不一致。
什么情况下设备方向与viewcontroller方向不一致?
当app不支持某些旋转方向时,viewcontroller方向与设备方向便不再一致,比如播放视频只支持landscapeleft方向,但是播放时,设备与viewcontroller方向不一致时,需要按照设备方向进行提示,提示用户把设备方向调整正常播放效果更好等。
而viewcontroller的方向也可以采用view的旋转和状态栏的方向设置来实现。
设备方向是指设备的物理方向,获取方法有两种:
1. UIDevice系统消息监听
2.重力感应检测
UIDevice系统消息监听方法:
此方法有很大缺陷,首先,首次的设备方向无法获取,另外,系统设置锁屏的情况下,设备不再产生此消息,就不能获取到消息了。
1. 开始产生设备方向,注册设备方向变化通知
UIDevice *device = [UIDevice currentDevice];
_isDeviceGeneratingDeviceOrientationNotifications = device.isGeneratingDeviceOrientationNotifications;
if (!_isDeviceGeneratingDeviceOrientationNotifications) {
[device beginGeneratingDeviceOrientationNotifications];
}
// 注册设备的方向通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceOrientationChanged:) name:UIDeviceOrientationDidChangeNotification object:device];
2. 实现设备方向回调
//监测设备方向变化
- (void) deviceOrientationChanged:(NSNotification *)notification {
//获取设备方向,并显示提示对话框
UIDevice *device = [UIDevice currentDevice];
UIDeviceOrientation orientation = [device orientation];
}
3. 反注册设备方向通知的,停止产生设备方向变化消息
UIDevice *device = [UIDevice currentDevice];
//取消注册设备方向信息通知
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:device];
//恢复设备产生消息的状态
if (!_isDeviceGeneratingDeviceOrientationNotifications) {
[device endGeneratingDeviceOrientationNotifications];
}
重力感应方法获取设备方向:
只要设备支持加速器,就可获取设备方向。
1. 开始监听重力感应
if (