1.測(cè)試環(huán)境
- XCode版本無(wú)要求(建議:XCode7.0不需要開(kāi)發(fā)者賬號(hào)也可以進(jìn)行真機(jī)調(diào)試)
- 必須要求真機(jī)設(shè)備(只有真機(jī)設(shè)備才有"磁力計(jì)"傳感器)
2. 實(shí)現(xiàn)思路
- 利用"磁力計(jì)"傳感器,獲取設(shè)備朝向
- 根據(jù)設(shè)備朝向反向旋轉(zhuǎn)"指南針"圖片
3. 代碼實(shí)現(xiàn)
- 1.獲取設(shè)備朝向
// 1.導(dǎo)入CoreLocation框架以及對(duì)應(yīng)的主頭文件
#import <CoreLocation/CoreLocation.h>
// 2.創(chuàng)建CLLocationManager對(duì)象并設(shè)置代理
self.locationM = [[CLLocationManager alloc] init];
self.locationM.delegate = self;
// 3.獲取設(shè)備朝向前, 先判斷"磁力計(jì)"是否可用
if(![CLLocationManager headingAvailable]) return;
// 4. 調(diào)用方法, 開(kāi)始獲取設(shè)備朝向
[self.locationM startUpdatingHeading];
// 5. 在對(duì)應(yīng)的代理方法中獲取設(shè)備朝向信息
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading
{
// 旋轉(zhuǎn)圖片代碼
}
- 2.旋轉(zhuǎn)圖片
// 1.判斷當(dāng)前的角度是否有效(如果此值小于0,代表角度無(wú)效)
if(newHeading.headingAccuracy < 0) return;
// 2.獲取當(dāng)前設(shè)備朝向(磁北方向)
CGFloat angle = newHeading.magneticHeading;
// 3.轉(zhuǎn)換成為弧度
CGFloat radian = angle / 180.0 * M_PI;
// 4.帶動(dòng)畫(huà)反向旋轉(zhuǎn)指南針
[UIView animateWithDuration:0.5 animations:^{
self.compassView.transform = CGAffineTransformMakeRotation(-radian);
}];
4. 磁北與真北
- 真北方向:地理北極所在方向
- 磁北方向:
- 磁北角度: heading.magneticHeading --> 相對(duì)于"磁北方向"產(chǎn)生的角度
- 真北角度: heading.trueHeading --> 相對(duì)于"真北方向"產(chǎn)生的角度
5. 注意事項(xiàng)
- 獲取設(shè)備朝向前, 先判斷"磁力計(jì)"是否可用
[CLLocationManager headingAvailable];
- 獲取朝向前, 判斷當(dāng)前朝向信息是否有效
if(newHeading.headingAccuracy < 0) return;
-
注意設(shè)備朝向與"航向"的區(qū)別
- 設(shè)備朝向是指手機(jī)的朝向;
- "航向"可以理解為設(shè)備的移動(dòng)方向
使用"磁力計(jì)"傳感器獲取設(shè)備朝向, 不需要請(qǐng)求用戶(hù)授權(quán)
因?yàn)樵O(shè)備朝向不涉及用戶(hù)隱私