`
re_reference
  • 浏览: 237067 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

MapKit之在地图上加pin(转)

阅读更多
在MKMapView中加pin其实就是加入MKAnnonation, 可以加入服和MKAnnonation协议的pin,下面展示一下方法。

1.首先创建一个服和MKAnnonation协议的委托类
@interface AnnotationDelegate : NSObject <MKAnnotation> {  
    CLLocationCoordinate2D coordinate;  
}  
    
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;  
    
- (id) initWithCoordinate:(CLLocationCoordinate2D)coord;  
    
@end  
    
@implementation AnnotationDelegate  
    
@synthesize coordinate;  
    
- (id) initWithCoordinate:(CLLocationCoordinate2D)coord  
{  
    coordinate.latitude = coord.latitude;  
    coordinate.longitude = coord.longitude;  
    return self;  
}  
    
@end  

2. 实例化该委托对像,加入到MKMapView中。
view plaincopy to clipboardprint?
AnnotationDelegate * annotationDelegate = [[[AnnotationDelegate alloc] initWithCoordinate:coordinate] autorelease];  
[self._mapView addAnnotation:annotationDelegate];  

另一处介绍
#import <Foundation/Foundation.h>
#import <MapKit/MKAnnotation.h>
@interface DisplayMap : NSObject
<MKAnnotation>{
    CLLocationCoordinate2D coordinate;
    NSString *title;
    NSString *subtitle;
}
@property (nonatomic, assign) CLLocationCoordinate2D coordinate;
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *subtitle;
@end
 
 
#import "DisplayMap.h"
@implementation DisplayMap
@synthesize coordinate,title,subtitle;
-(void)dealloc{
    [title release];
    [super dealloc];
}
@end

修改viewDidLoad方法
- (void)viewDidLoad {
    [super viewDidLoad];
    //mapView.showsUserLocation=YES;
    self.mapView.delegate=self;
    CLLocationManager *locationManager = [[CLLocationManager alloc] init];//创建位置管理器
    locationManager.delegate=self;//设置代理
    locationManager.desiredAccuracy=kCLLocationAccuracyBest;//指定需要的精度级别
    locationManager.distanceFilter=1000.0f;//设置距离筛选器
    [locationManager startUpdatingLocation];//启动位置管理器
  
    MKCoordinateRegion theRegion = { {0.0, 0.0 }, { 0.0, 0.0 } };
    theRegion.center=[[locationManager location] coordinate];
    [locationManager release];
    [mapView setZoomEnabled:YES];
    [mapView setScrollEnabled:YES];
    theRegion.span.longitudeDelta = 0.01f;
    theRegion.span.latitudeDelta = 0.01f;
    [mapView setRegion:theRegion animated:YES];
    DisplayMap *ann = [[DisplayMap alloc] init];
    ann.title = @"欧陆经典";
    ann.subtitle = @"vsp";
    //地点名字
    ann.coordinate = theRegion.center;
    [mapView addAnnotation:ann];
}
- (MKAnnotationView *)mapView:(MKMapView *)mV viewForAnnotation:(id <MKAnnotation>)annotation
{
    MKPinAnnotationView *pinView = nil;
    if(annotation != mapView.userLocation)
    {
        static NSString *defaultPinID = @"com.invasivecode.pin";
        pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:defaultPinID];
        if ( pinView == nil ) pinView = [[[MKPinAnnotationView alloc]
                                          initWithAnnotation:annotation reuseIdentifier:defaultPinID] autorelease];
        pinView.pinColor = MKPinAnnotationColorRed;
        pinView.canShowCallout = YES;
        pinView.animatesDrop = YES;
    }
    else {
        [mapView.userLocation setTitle:@"欧陆经典"];
    [mapView.userLocation setSubtitle:@"vsp"];
    }
    return pinView;
}

注意:无论是自定义的MKAnnotationView还是标准的,一旦addAnnotation to MapView,如何更新它在地图上的位置呢?更新MKAnnotation protocol中的coordinate可以做到吗? 如果是手动更新位置是不可以让它在地图上移动的。请看官网文档 ,其中有一段描述:
“Important: When you implement the coordinate property in your class, it is recommended that you synthesize its creation. If you choose to implement the methods for this property yourself, or if you manually modify the variable underlying that property in other parts of your class after the annotation has been added to the map, be sure to send out key-value observing (KVO) notifications when you do. Map Kit uses KVO notifications to detect changes to the coordinate, title, and subtitle properties of your annotations and make any needed changes to the map display. If you do not send out KVO notifications, the position of your annotations may not be updated properly on the map.For more information about how to implement KVO-compliant accessor methods, see Key-Value Observing Programming Guide.”


手动更新后必须用KVO的方式通知系统,不然系统是不知道更新位置的。如何通知道呢,其实NSObject中有这样的方法willChangeValueForKey and didChangeValueForKey。如你写了个方法更新pin位置,如下:
view sourceprint?-(void)UpdateCoord:(CLLocationCoordinate2D)newCoord   
{   
        [self willChangeValueForKey:@"coordinate"];   
        coordinate = newCoord;   
        [self didChangeValueForKey:@"coordinate"];   
}

IOS4中更新更简单,只需要调用- (void)setCoordinate:(CLLocationCoordinate2D)newCoordinate;这个方法就可以自动更新了。
分享到:
评论

相关推荐

    IOS应用源码之DefaultPinView自定义地图大头针实现.zip

    在iOS中,地图功能主要通过苹果的MapKit框架来实现,而大头针(Annotation)是MapKit中用于在地图上标记特定位置的重要元素。默认情况下,大头针显示为红色,并有一个可选的标题和子标题。然而,为了提供更好的用户...

    IOS应用源码之点击地图上的指针弹出窗口(里面显示该地点的相关信息) .rar

    本示例源码“点击地图上的指针弹出窗口(里面显示该地点的相关信息)”主要展示了如何在iOS应用中实现地图交互功能,特别是当用户点击地图上的标记(pin)时,弹出一个窗口展示该地点的详细信息。这个功能是通过集成...

    IOS应用源码之地图上多个指针显示(一些本地化应用或社交应用可以用得到) .rar

    这个源码示例——"地图上多个指针显示”提供了如何在iOS地图上同时展示多个定位点的方法,这对于创建如位置分享、导航或者基于位置的社交功能十分有用。下面我们将深入探讨这一技术。 首先,我们需要了解的是苹果...

    IOS 地图开发 标注

    在iOS应用开发中,地图功能是非常重要的一部分,特别是在构建导航、位置服务或地理信息系统相关的应用时。本教程将深入探讨如何在iOS应用中实现地图...MapKit提供了丰富的API,使得在iOS上构建地图应用变得简单而强大。

    iOS地图显示、定位、大头针、气泡等简单使用

    在iOS开发中,地图功能是不可或缺的一部分,MapKit框架提供了集成地图、定位、大头针以及自定义气泡等核心功能。本篇文章将详细介绍如何在iOS应用中使用这些功能。 首先,我们需要导入MapKit框架,这可以通过在...

    ios应用源码之地图上多个指针显示(一些本地化应用或社交应用可以用得到) 2018127

    总的来说,要在iOS应用中实现在地图上显示多个指针,我们需要利用MapKit框架中的MKMapView和MKPointAnnotation,通过设置坐标、标题并将其添加到地图中。同时,通过自定义MKAnnotationView,我们可以进一步优化指针...

    ios 地图 大头针

    在iOS开发中,地图功能是不可或缺的一部分,而“大头针”(Pin)则是地图上常用的一种标记元素,用于指示特定的位置或者兴趣点。本文将深入探讨如何在iOS应用中实现地图上的大头针功能,以及相关的类库封装。 首先...

    iOS 5 Programming中文版第六章

    4. **在地图视图上添加标记点** 5. **自定义标记点样式** ### 6.1 创建一个地图的视图 #### 6.1.1 问题 如何在iOS应用中集成地图功能?特别是如何显示一个基本的地图视图? #### 6.1.2 方案 为了实现在应用中...

    map MKPinAnnotationView自定义(地点标记自定义)

    苹果提供了强大的MapKit框架,使得开发者可以轻松地在应用中集成地图,并对地图上的元素进行自定义。本篇将深入讲解如何利用MapKit中的`MKPinAnnotationView`进行地点标记的自定义,以满足个性化的需求。 `...

    自定义较复杂地图标注ios

    1. **自定义地图标注背景图**:在标准的`MKAnnotationView`中,通常只显示一个小的 pin 图标。为了实现自定义背景图,你需要继承`MKAnnotationView`,并在重写`- (void)layoutSubviews`方法中设置背景图片,例如`...

    iOS 6实践指南(中文文字版).pdf

    - 显示标记(pin)在地图上标注特定地点。 - **使用相机功能**: - 调用相机拍摄照片。 - 处理拍摄后的照片数据。 - 存储和显示拍摄的照片。 #### 六、设置、音频及晃动检测 - **TimeDown 应用案例分析**: - ...

Global site tag (gtag.js) - Google Analytics