本文並非最終版本,如果想要關註更新或更正的內容請關註文集,聯繫方式詳見文末,如有疏忽和遺漏,歡迎指正。 本文相關目錄: ================== 所屬文集: "【iOS】07 設備工具 " ================== "7.4 定位服務 1.0 簡介" "7.4 定位服務 2. ...
本文並非最終版本,如果想要關註更新或更正的內容請關註文集,聯繫方式詳見文末,如有疏忽和遺漏,歡迎指正。
本文相關目錄:
================== 所屬文集:【iOS】07 設備工具 ==================
7.4 定位服務->1.0 簡介
7.4 定位服務->2.1.1 定位 - 官方框架CoreLocation: 請求用戶授權
7.4 定位服務->2.1.2 定位 - 官方框架CoreLocation: CLLocationManager位置管理器
7.4 定位服務->2.1.3.1 定位 - 官方框架CoreLocation 功能1:地理定位
7.4 定位服務->2.1.3.2 定位 - 官方框架CoreLocation 功能2:地理編碼和反地理編碼
7.4 定位服務->2.1.3.3 定位 - 官方框架CoreLocation 功能3:區域監聽
7.4 定位服務->2.1.4 定位 - 官方框架CoreLocation 案例:指南針效果
7.4 定位服務->2.2 定位 - locationManager框架
7.4 定位服務->3.1 地圖框架MapKit 功能1:地圖展示
7.4 定位服務->3.2 地圖框架MapKit 功能2:路線規劃(導航)
7.4 定位服務->3.3 地圖框架MapKit 功能3:3D視圖
7.4 定位服務->3.4 地圖框架MapKit 功能4:地圖截圖
7.4 定位服務->3.5 地圖框架MapKit 功能5:POI檢索
================== 所屬文集:【iOS】07 設備工具 ==================
定位目錄:
官方框架CoreLocation目錄:
本文目錄:
1.0 實現思路
2.0 概念補充
3.0 測試環境
代碼8:指南針效果 Demo
編譯環境:Xcode 8.0
模擬器版本:iOS 10
Swift版本:3.0
【OC 語言】
#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>
@interface ViewController ()<CLLocationManagerDelegate>
@property (nonatomic, strong) CLLocationManager *locationM;
@property (weak, nonatomic) IBOutlet UIImageView *compassView;
@end
@implementation ViewController
#pragma mark - 懶載入
-(CLLocationManager *)locationM
{
if (!_locationM) {
_locationM = [[CLLocationManager alloc] init];
_locationM.delegate = self;
}
return _locationM;
}
- (void)viewDidLoad {
[super viewDidLoad];
// 判斷"磁力計是否可用"
if ([CLLocationManager headingAvailable]) {
// 開始監聽設備朝向
[self.locationM startUpdatingHeading];
}
}
#pragma mark - CLLocationManagerDelegate
-(void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading{
// 1.判斷當前的角度是否有效(如果此值小於0,代表角度無效)
if(newHeading.headingAccuracy < 0)
return;
NSLog(@"%f", newHeading.magneticHeading);
// 2.獲取當前設備朝向(磁北方向)
CGFloat angle = newHeading.magneticHeading;
// 3.轉換成為弧度
CGFloat radian = angle / 180.0 * M_PI;
// 4.帶動畫反向旋轉指南針
[UIView animateWithDuration:0.5 animations:^{
self.compassView.transform = CGAffineTransformMakeRotation(-radian);
}];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
【Swift 語言】
import UIKit
import CoreLocation
class ViewController: UIViewController {
@IBOutlet weak var compassView: UIImageView!
// 1. 懶載入,創建位置管理者
lazy var locationM: CLLocationManager = {
let locationM = CLLocationManager()
locationM.delegate = self
return locationM
}()
override func viewDidLoad() {
super.viewDidLoad()
// 2. 判斷當前"磁力計"感測器是否可用
if CLLocationManager.headingAvailable() {
// 使用位置管理者, 獲取當前設備朝向
locationM.startUpdatingHeading()
}else {
print("當前磁力計設備損壞")
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
// 代理協議
extension ViewController: CLLocationManagerDelegate {
func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) {
// 0.判斷當前的角度是否有效(如果此值小於0,代表角度無效)
if newHeading.headingAccuracy < 0 { return }
// 1.獲取當前設備朝向(0- 359.9 角度)
let angle = newHeading.magneticHeading
// 1.1 把角度轉換成為弧度
let hudu = CGFloat(angle / 180 * M_PI)
// 2. 反向旋轉圖片(弧度)
UIView.animate(withDuration: 0.5, animations: {
self.compassView.transform = CGAffineTransform(rotationAngle: -hudu)
})
}
}
本文源碼 Demo 詳見 Github
https://github.com/shorfng/iOS_7.0_Device-Tools
作者:藍田(Loto)
【作品發佈平臺】
① 簡書
② 博客園
③ Gitbook(如果覺得文章太長,請閱讀此平臺發佈的文章)
【代碼托管平臺】
【如有疑問,請通過以下方式交流】
① 評論區回覆
② 發送郵件
至 [email protected]
本文版權歸作者和本網站共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,謝謝合作。
如果覺得我的文章對您有用,請隨意打賞。您的支持將鼓勵我繼續創作!
支付寶掃一掃 向我打賞
你也可以微信 向我打賞