• 定位


    #import <Foundation/Foundation.h>

    #import <MapKit/MapKit.h>

    @interface PPAnnotation : NSObject<MKAnnotation>

    /**

     *  大头针的位置

     */

    @property (nonatomic, assign) CLLocationCoordinate2D coordinate;

    /**

     *  大头针标题

     */

    @property (nonatomic, copy) NSString *title;

    /**

     *  大头针的子标题

     */

    @property (nonatomic, copy) NSString *subtitle;

    /**

     *  图标

     */

    @property (nonatomic, copy) NSString *icon;

    @end

     ------------------------------------------------------------------------------------------------------------------

    #import <MapKit/MapKit.h>

    @interface PPAnnotationView : MKAnnotationView

    /**

     *  快速创建 大头针

     *

     *  @param mapView mapView

     */

    + (instancetype)annotationViewWithMap:(MKMapView *)mapView;

    @end

    #import "PPAnnotationView.h"

    #import "PPAnnotation.h"

    @implementation PPAnnotationView

    - (instancetype)initWithAnnotation:(id<MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier

    {

        if (self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier]) {

            // 初始化

            

          

            // 设置显示标题

            self.canShowCallout = YES;

            

            // 设置辅助视图

            self.leftCalloutAccessoryView = [[UISwitch alloc] init];

            self.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeContactAdd];

        }

        return self;

    }

    + (instancetype)annotationViewWithMap:(MKMapView *)mapView

    {

        static NSString *ID = @"anno";

        // 1. 从缓存中取

        // [注意] 默认情况下, MKAnnotationView 是无法显示的, 如果想自定义大头针, 需要使用MKAnnotationView的子类 MKPinAnnotationView

        // [注意] 如果是自定义的大头针, 默认情况点击大头针不会显示标题和副标题, 需要手动设置显示

        //    MKPinAnnotationView *annoView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:ID];

        PPAnnotationView *annoView = (PPAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:ID];

        

        // 2. 如果缓存中没有, 创建一个新的大头针

        if (annoView == nil) {

            annoView = [[PPAnnotationView alloc] initWithAnnotation:nil reuseIdentifier:ID];

        }

        return annoView;

    }

    //- (void)setAnnotation:(id<MKAnnotation>)annotation

    - (void)setAnnotation:(PPAnnotation *)annotation

    {

        [super setAnnotation:annotation];

        

        // 处理自己特有的操作

        self.image = [UIImage imageNamed:annotation.icon];

    }

    @end

     ---------------------------------------------------------------------------------------------

    #import "ViewController.h"

    //#import <MapKit/MapKit.h>

    #import "PPAnnotation.h"

    #import "PPAnnotationView.h"

    @interface ViewController ()<MKMapViewDelegate>

    /**

     *  地图

     */

    @property (weak, nonatomic) IBOutlet MKMapView *mapView;

    @property (nonatomic, strong) CLLocationManager *mgr;

    @property (nonatomic, strong) CLGeocoder *geocoder;

    @end

    @implementation ViewController

    /**

     *  添加大头针

     */

    - (IBAction)addAnnotation:(id)sender {

        PPAnnotation * annotation = [[PPAnnotation alloc] init];

        annotation.title = @"北京智德创辉网络科技有限公司";

        annotation.subtitle = @"RO";

        annotation.icon = @"category_4";

        

        CGFloat latitude = 39.915094 + arc4random_uniform(20);

        CGFloat longitude = 116.487775 + arc4random_uniform(20);

        annotation.coordinate = CLLocationCoordinate2DMake(latitude, longitude);

        

        [self.mapView addAnnotation:annotation];

        

    }

    - (CLLocationManager *)mgr{

        if (!_mgr) {

            _mgr = [[CLLocationManager alloc] init];

        }

        return _mgr;

    }

    - (CLGeocoder *)geocoder{

        if (!_geocoder) {

            _geocoder = [[CLGeocoder alloc] init];

        }

        return _geocoder;

    }

    - (void)viewDidLoad {

        [super viewDidLoad];

        // ios 8

        if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {

            [self.mgr requestAlwaysAuthorization];

        }

        

        // 设置代理

        self.mapView.delegate = self;

        

        // 设置模式

        self.mapView.mapType = MKMapTypeStandard;

        

        // 设置跟踪

        self.mapView.userTrackingMode = MKUserTrackingModeFollow;

        

        // 设置xuanzhuan

        self.mapView.rotateEnabled = NO;

    }

    #pragma mark -MKMapViewDelegate

    /**

     *  每次添加大头针 都会调用此方法

     *

     *  @param mapView    地图

     *  @param annotation 大头针模型

     */

    - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation

    {

        

        LogYellow(@"%@",annotation);

        // 对用户当前位置的大头针, 特殊处理 - MKUserLocation

        if(![annotation isKindOfClass:[PPAnnotation class]]){

            return nil;

        }

        // 1. 创建大头针

        PPAnnotationView *annoView = [PPAnnotationView annotationViewWithMap:mapView];

        

        // 2. 设置模型

        annoView.annotation = annotation;

        

        

        // 3. 返回大头针

        return annoView;

    }

    /**

     *  地图区域改变完成 会调用此方法

     */

    - (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated

    {

        NSLog(@"地图区域改变完成");

        /**

         *

         CLLocationCoordinate2D center;

         MKCoordinateSpan span;

         */

        LogRed(@"%f --- %f",self.mapView.region.span.latitudeDelta,  self.mapView.region.span.longitudeDelta);

        

    }

    - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation

    {

        [self.geocoder reverseGeocodeLocation:userLocation.location completionHandler:^(NSArray *placemarks, NSError *error) {

            

            CLPlacemark *placemark = [placemarks firstObject];

            

            userLocation.title = placemark.name;

            userLocation.subtitle  = placemark.locality;

            

        }];

        

        // 移动地图到当前用户所在位置

        [self.mapView setCenterCoordinate:userLocation.location.coordinate animated:YES];

        

        /*

        // 设置地图显示的区域

        CLLocationCoordinate2D center = userLocation.location.coordinate;

        // 指定经纬度的跨度

        MKCoordinateSpan span = MKCoordinateSpanMake(0.001, 0.0001);

        

        // 将用户的当前位置 设置为中心点, 并且制定显示的跨度

        MKCoordinateRegion region = MKCoordinateRegionMake(center, span);

        [self.mapView setRegion:region animated:YES];

         */

        

        

    }

  • 相关阅读:
    SQL Server 与 Entity Framework 级联删除
    web api 2 学习笔记 (Odata ODataQueryOptions 使用)
    【建议收藏】设计师必备-史上最全的个人资料页面设计模板下载
    浅谈产品经理入门和学习路径
    最全面!2019年最新UX设计趋势预测合集
    最新Dashboard设计实例、技巧和资源集锦,视觉和功能两不误,妥妥的!
    【技巧分享】设计师如何向开发人员顺利交付作品?
    摹客iDoc201901-2新功能点评
    企业类Web原型制作分享-Kraftwerk
    【新年福利】2019年值得一用的8款协作工具
  • 原文地址:https://www.cnblogs.com/guangleijia/p/4828544.html
Copyright © 2020-2023  润新知