1.测试环境
- XCode版本无要求(建议:XCode7.0不需要开发者账号也可以进行真机调试)
- 必须要求真机设备(只有真机设备才有"磁力计"传感器)
2. 实现思路
- 利用"磁力计"传感器,获取设备朝向
- 根据设备朝向反向旋转"指南针"图片
3. 代码实现
- 1.获取设备朝向
// 1.导入CoreLocation框架以及对应的主头文件
#import <CoreLocation/CoreLocation.h>
// 2.创建CLLocationManager对象并设置代理
self.locationM = [[CLLocationManager alloc] init];
self.locationM.delegate = self;
// 3.获取设备朝向前, 先判断"磁力计"是否可用
if(![CLLocationManager headingAvailable]) return;
// 4. 调用方法, 开始获取设备朝向
[self.locationM startUpdatingHeading];
// 5. 在对应的代理方法中获取设备朝向信息
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading
{
// 旋转图片代码
}
- 2.旋转图片
// 1.判断当前的角度是否有效(如果此值小于0,代表角度无效)
if(newHeading.headingAccuracy < 0) return;
// 2.获取当前设备朝向(磁北方向)
CGFloat angle = newHeading.magneticHeading;
// 3.转换成为弧度
CGFloat radian = angle / 180.0 * M_PI;
// 4.带动画反向旋转指南针
[UIView animateWithDuration:0.5 animations:^{
self.compassView.transform = CGAffineTransformMakeRotation(-radian);
}];
4. 磁北与真北
- 真北方向:地理北极所在方向
- 磁北方向:
- 磁北角度: heading.magneticHeading --> 相对于"磁北方向"产生的角度
- 真北角度: heading.trueHeading --> 相对于"真北方向"产生的角度
5. 注意事项
- 获取设备朝向前, 先判断"磁力计"是否可用
[CLLocationManager headingAvailable];
- 获取朝向前, 判断当前朝向信息是否有效
if(newHeading.headingAccuracy < 0) return;
-
注意设备朝向与"航向"的区别
- 设备朝向是指手机的朝向;
- "航向"可以理解为设备的移动方向
使用"磁力计"传感器获取设备朝向, 不需要请求用户授权
因为设备朝向不涉及用户隐私