美文网首页定位iOS Developer
【iOS】7.4 定位服务->2.1.4 定位 - 官方框

【iOS】7.4 定位服务->2.1.4 定位 - 官方框

作者: 蓝田_Loto | 来源:发表于2016-09-29 14:17 被阅读109次

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正。


    本文相关目录:
    ================== 所属文集:【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(如果觉得文章太长,请阅读此平台发布的文章)

    【代码托管平台】

    Github

    【如有疑问,请通过以下方式交流】

    评论区回复
    发送邮件shorfng@126.com


    本文版权归作者和本网站共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,谢谢合作。


    如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
    • 支付宝扫一扫 向我打赏


    • 你也可以微信 向我打赏


    相关文章

      网友评论

        本文标题:【iOS】7.4 定位服务->2.1.4 定位 - 官方框

        本文链接:https://www.haomeiwen.com/subject/hkwkyttx.html