zoukankan      html  css  js  c++  java
  • 如何使用地图的注解功能

    如何使用地图的注解功能

    实现了协议MKAnnotation的对象才能够被用地图上的注解对象,一般都是如下定义的.

    DisplayMap.h + DisplayMap.m

    //
    //  DisplayMap.h
    //  MoreMapInfo
    //
    //  Copyright (c) 2014年 Y.X. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    #import <MapKit/MapKit.h>
    
    @interface DisplayMap : NSObject <MKAnnotation>
    
    @property (nonatomic, copy, readonly)   NSString                *title;
    @property (nonatomic, copy, readonly)   NSString                *subtitle;
    @property (nonatomic, assign, readonly) CLLocationCoordinate2D   coordinate;
    
    - (id)initWithTitle:(NSString*)title
               SubTitle:(NSString*)subtitle
             Coordinate:(CLLocationCoordinate2D)coordinate;
    
    @end
    //
    //  DisplayMap.m
    //  MoreMapInfo
    //
    //  Copyright (c) 2014年 Y.X. All rights reserved.
    //
    
    #import "DisplayMap.h"
    
    @implementation DisplayMap
    
    - (id)initWithTitle:(NSString*)title
               SubTitle:(NSString*)subtitle
             Coordinate:(CLLocationCoordinate2D)coordinate
    {
        if (self = [super init])
        {
            _title      = title;
            _subtitle   = subtitle;
            _coordinate = coordinate;
        }
        
        return self;
    }
    
    @end

    RootViewController.m

    //
    //  RootViewController.m
    //  MoreMapInfo
    //
    //  Copyright (c) 2014年 Y.X. All rights reserved.
    //
    
    #import "RootViewController.h"
    #import <MapKit/MapKit.h>
    #import "DisplayMap.h"
    #import "LocationCoder.h"
    #import "YXLocationManager.h"
    
    @interface RootViewController ()<CLLocationManagerDelegate, MKMapViewDelegate>
    
    @property (nonatomic, strong) MKMapView  *mapView;
    
    @end
    
    @implementation RootViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        [YXLocationManager getCurrentLocation:^(CLLocation *location, NSError *error) {
            if (error == nil)
            {
                // 将经纬度解析为地址
                LocationCoder *lCoder = [[LocationCoder alloc] initWithLocation:location];
                [lCoder startAnalyseLocation];
                lCoder.resultBlock = ^(NSArray *placemarks, NSError *error,
                                       LocationCoder *locationCoder)
                {
                    NSLog(@"%@", locationCoder.addressLines);
                };
                
                //地图
                _mapView = [[MKMapView alloc]initWithFrame:self.view.bounds];
                _mapView.delegate          = self;
                _mapView.showsUserLocation = YES;
                _mapView.mapType           = MKMapTypeHybrid;
                _mapView.region = MKCoordinateRegionMake(location.coordinate,
                                                         MKCoordinateSpanMake(0.1, 0.1));
                
                //加入大头针
                DisplayMap *anno = [[DisplayMap alloc]initWithTitle:@"title"
                                                           SubTitle:@"subtitle"
                                                         Coordinate:CLLocationCoordinate2DMake(39.928168, 116.39328)];
                [_mapView addAnnotation:anno];
                [self.view addSubview:_mapView];
                
                //给地图添加长按手势,插上大头针
                UILongPressGestureRecognizer* longPress = 
                [[UILongPressGestureRecognizer alloc] initWithTarget:self
                                                              action:@selector(longPress:)];
                [_mapView addGestureRecognizer:longPress];
            }
            else
            {
                NSLog(@"%@", error);
            }
        }];
    }
    
    #pragma mark - viewDidLoad UILongPressGestureRecognize longPress:
    - (void)longPress:(UILongPressGestureRecognizer*)longPress
    {
        //长按一次 只在开始插入一次大头针   否则能用大头针写字。。。
        if (longPress.state == UIGestureRecognizerStateBegan)
        {
            CGPoint point = [longPress locationInView:_mapView];
            CLLocationCoordinate2D coordinate = [_mapView convertPoint:point
                                                  toCoordinateFromView:_mapView];
            
            
            DisplayMap* an = [[DisplayMap alloc] initWithTitle:@"title"
                                                      SubTitle:@"subtitle"
                                                    Coordinate:coordinate];
            [_mapView addAnnotation:an];
            
            [_mapView setCenterCoordinate:coordinate
                                 animated:YES];
        }
    }
    
    #pragma mark - MKMapViewDelegate
    - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
    {
        //如果是所在地,跳过(固定写法)
        if ([annotation isKindOfClass:[mapView.userLocation class]])
        {
            return nil;
        }
        
        // 重用
        MKPinAnnotationView* pinView = (MKPinAnnotationView*)
            [mapView dequeueReusableAnnotationViewWithIdentifier:@"ID"];
        if (pinView == nil)
        {
            pinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation
                                                      reuseIdentifier:@"ID"];
        }
        
        //能显示Call信息上面那些图字(很重要哦)
        pinView.canShowCallout = YES;
        
        //只有三种
        pinView.pinColor = MKPinAnnotationColorPurple;
    
        //显示动画 - 从天上落下
        pinView.animatesDrop = YES;
        
        pinView.image = [UIImage imageNamed:@"地图标点"];
        
        // 左侧CalloutAccessoryView(使用了自定义view)
        UIView* view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 50)];
        view.backgroundColor = [UIColor redColor];
        pinView.leftCalloutAccessoryView = view;
        
        // 右侧CalloutAccessoryView(使用了系统的按钮)
        UIButton* button = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        pinView.rightCalloutAccessoryView = button;
        
        return pinView;
    }
    
    - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
    {
        NSLog(@"点击事件");
    }
    
    @end

    打印信息:

    2014-05-26 10:24:46.005 MoreMapInfo[6138:60b] AKLocation - [Line 118]
     Started locating
     ==============
     Distance filter accuracy: -1.00
     Desired accuracy: 100.00
     Timeout: 10.00
    May 26 10:24:47 Phoenix MoreMapInfo[6138] <Error>: CGBitmapContextCreate: unsupported parameter combination: 5 integer bits/component; 16 bits/pixel; 3-component color space; kCGImageAlphaNoneSkipLast; 512 bytes/row.
    2014-05-26 10:24:47.331 MoreMapInfo[6138:9c07] vImage decode failed, falling back to CG path.
    May 26 10:24:47 Phoenix MoreMapInfo[6138] <Error>: CGBitmapContextCreate: unsupported parameter combination: 5 integer bits/component; 16 bits/pixel; 3-component color space; kCGImageAlphaNoneSkipLast; 512 bytes/row.
    2014-05-26 10:24:47.372 MoreMapInfo[6138:8f0b] vImage decode failed, falling back to CG path.
    2014-05-26 10:24:47.462 MoreMapInfo[6138:60b] 中国北京市东城区东四街道东四朝阳门北小街2-1号
    May 26 10:24:48 Phoenix MoreMapInfo[6138] <Error>: CGBitmapContextCreate: unsupported parameter combination: 5 integer bits/component; 16 bits/pixel; 3-component color space; kCGImageAlphaNoneSkipLast; 512 bytes/row.
    2014-05-26 10:24:48.363 MoreMapInfo[6138:a803] vImage decode failed, falling back to CG path.
    May 26 10:24:48 Phoenix MoreMapInfo[6138] <Error>: CGBitmapContextCreate: unsupported parameter combination: 5 integer bits/component; 16 bits/pixel; 3-component color space; kCGImageAlphaNoneSkipLast; 512 bytes/row.
    2014-05-26 10:24:48.375 MoreMapInfo[6138:a603] vImage decode failed, falling back to CG path.
    May 26 10:24:48 Phoenix MoreMapInfo[6138] <Error>: CGBitmapContextCreate: unsupported parameter combination: 5 integer bits/component; 16 bits/pixel; 3-component color space; kCGImageAlphaNoneSkipLast; 512 bytes/row.
    2014-05-26 10:24:48.402 MoreMapInfo[6138:9607] vImage decode failed, falling back to CG path.
    May 26 10:24:48 Phoenix MoreMapInfo[6138] <Error>: CGBitmapContextCreate: unsupported parameter combination: 5 integer bits/component; 16 bits/pixel; 3-component color space; kCGImageAlphaNoneSkipLast; 512 bytes/row.
    May 26 10:24:48 Phoenix MoreMapInfo[6138] <Error>: CGBitmapContextCreate: unsupported parameter combination: 5 integer bits/component; 16 bits/pixel; 3-component color space; kCGImageAlphaNoneSkipLast; 512 bytes/row.
    2014-05-26 10:24:48.420 MoreMapInfo[6138:910b] vImage decode failed, falling back to CG path.
    2014-05-26 10:24:48.421 MoreMapInfo[6138:9e07] vImage decode failed, falling back to CG path.
    2014-05-26 10:25:10.317 MoreMapInfo[6138:60b] 点击事件

    要点:

    // 能显示Call信息上面那些图字(很重要哦)
    pinView.canShowCallout = YES

  • 相关阅读:
    f5和ctrl+f5之浏览器缓存机制
    一次简单的http请求会碰撞出什么火花
    javascript的数据类型
    javascript语法规范
    javascript(ECMAScript)
    overflow:hidden可以将页面溢出内容隐藏起来
    抽屉新热榜头部实现
    数据分析
    抽屉页面设计
    position(relative)
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/3752547.html
Copyright © 2011-2022 走看看