如何在iPhone MapKit上添加自定义标记?

15

我正在iPhone上测试MapKit框架,希望将显示位置的标准图钉更换为名为“location.png”的图像。

我应该如何修改代码以实现这一点?

Maincontroller

- (void)viewDidLoad
{
    [super viewDidLoad];

    //
    // Set the map center
    //
    CLLocationCoordinate2D coordinate;
    coordinate.latitude = 49.2802;
    coordinate.longitude = -123.1182;
    mapView.region = MKCoordinateRegionMakeWithDistance(coordinate, 2000, 2000);

    //
    // Set 10 random locations on the map for testing purposes
    //
    for(int i = 0; i < 10; i++)
    {
        CGFloat latDelta = rand()*.035/RAND_MAX -.02;
        CGFloat longDelta = rand()*.03/RAND_MAX -.015;

        CLLocationCoordinate2D newCoord = { coordinate.latitude + latDelta, coordinate.longitude + longDelta };
        MapAnnotation* annotation = [[MapAnnotation alloc] initWithCoordinate:newCoord];
        [mapView addAnnotation:annotation];
        [annotation release];
    }

    [mapView setDelegate:self];
}

MapAnnotation.h

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>

@interface MapAnnotation : NSObject <MKAnnotation> {
    CLLocationCoordinate2D _coordinate;
}

- (id)initWithCoordinate:(CLLocationCoordinate2D)coordinate;

@end

MapAnnotation.m

#import "MapAnnotation.h"

@implementation MapAnnotation
@synthesize coordinate = _coordinate;

- (id)initWithCoordinate:(CLLocationCoordinate2D)coordinate
{
    self = [super init];

    if (self != nil)
    {
        _coordinate = coordinate;
    }

    return self;
}

@end

谢谢!

4个回答

24

在查看MapCallouts的源代码后,我解决了这个问题。

以下是我的解决方案:

- (MKAnnotationView *)mapView:(MKMapView *)map viewForAnnotation:(id <MKAnnotation>)annotation
{
    static NSString *AnnotationViewID = @"annotationViewID";

    MKAnnotationView *annotationView = (MKAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:AnnotationViewID];

    if (annotationView == nil)
    {
        annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationViewID] autorelease];
    }

    annotationView.image = [UIImage imageNamed:@"location.png"];
    annotationView.annotation = annotation;

    return annotationView;
}

2
似乎你需要将mapView更改为map。 - Cfr
@Christoffer,WeatherMap的链接已经失效。 - Daniel Gomez Rico
作为WeatherMap链接的替代方案,这里提供一个相关的苹果文档:https://developer.apple.com/library/mac/documentation/UserExperience/Conceptual/LocationAwarenessPG/AnnotatingMaps/AnnotatingMaps.html - SimplGy

5

请使用以下代码

PlacePin.h

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>

@interface PlacePin : NSObject<MKAnnotation> {
CLLocationCoordinate2D coordinate; 
NSString *title; 
NSString *subtitle;
int nTag;
}

@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
@property (nonatomic,copy) NSString *title; 
@property (nonatomic,copy) NSString *subtitle;
@property (nonatomic) int nTag;

- (id)initWithLocation:(CLLocationCoordinate2D)coord;

@end

PlacePin.m

#import "PlacePin.h"
@implementation PlacePin

@synthesize coordinate,title,subtitle;
@synthesize nTag;

- (id)initWithLocation:(CLLocationCoordinate2D)coord{   

self = [super init];    
if (self) {         
    coordinate = coord;     
}
return self;    
}

-(void)dealloc{
[title release];
[subtitle release];
[super dealloc];
}
@end

callingView.h

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import "PlacePin.h"

@interface ViewController : UIViewController<MKMapViewDelegate>{
NSMutableArray *Arr_Latitude;
CGFloat double_lat;
CGFloat double_long;

}
@property (retain, nonatomic) IBOutlet MKMapView *mapView;
-(void)zoomToFitMapAnnotations:(MKMapView*)mv;

@end

callingView.m

- (void)viewDidLoad
 {
[super viewDidLoad];
//create demo latlong array
NSMutableArray *arrLat=[[NSMutableArray alloc] initWithObjects:@"23.0333",@"24.0333",@"25.0333",@"26.0333" ,nil];
NSMutableArray *arrLong=[[NSMutableArray alloc] initWithObjects:@"72.6167",@"71.6167",@"70.6167",@"71.6167", nil];
NSMutableArray *arrTitle=[[NSMutableArray alloc] initWithObjects:@"Point1",@"Point2",@"Point3",@"Point4", nil];


Arr_Latitude=[[NSMutableArray alloc] init];
for(int i=0; i<[arrLat count];i++)
{
    NSMutableDictionary *dictLatlong=[[NSMutableDictionary alloc] init];
    [dictLatlong setObject:[arrLat objectAtIndex:i] forKey:@"Latitude"];
    [dictLatlong setObject:[arrLong objectAtIndex:i] forKey:@"Longitude"];
    [dictLatlong setObject:[arrTitle objectAtIndex:i] forKey:@"Title"];

    [Arr_Latitude addObject:dictLatlong];

}
NSLog(@"--------------- %@",[Arr_Latitude description]);
[arrLat release];
[arrLong release];



mapView.delegate = self;
[mapView setMapType:MKMapTypeSatellite];

MKCoordinateRegion region;
MKCoordinateSpan span;
span.latitudeDelta=0.2;
span.longitudeDelta=0.2;

CLLocationCoordinate2D location;

region.span = span;
region.center = location;


for (int i = 0; i<[Arr_Latitude count]; i++)
{
    double_lat = [[[Arr_Latitude objectAtIndex:i]valueForKey:@"Latitude"] doubleValue];
    double_long = [[[Arr_Latitude objectAtIndex:i]valueForKey:@"Longitude"] doubleValue];
    NSString *Title=[[Arr_Latitude objectAtIndex:i]valueForKey:@"Title"];

    location.latitude = double_lat;
    location.longitude = double_long;

    PlacePin *mapPoint = [[PlacePin alloc] initWithLocation:location];
    mapPoint.nTag = i;
    [mapPoint setTitle:Title];


    //        mapPoint.title = [[locationArray objectAtIndex:i] Name];

    [mapView addAnnotation:mapPoint];
    mapPoint = nil;

    [mapView setRegion:region animated:YES];
    [mapView regionThatFits:region];
}

[self zoomToFitMapAnnotations:mapView];
}


-(void)zoomToFitMapAnnotations:(MKMapView*)mv
{
//NSLog(@"zoom To Fit Map Annotations");
if([mv.annotations count] == 0)
    return;

if([mv.annotations count] == 1) {

    MKCoordinateRegion region;
    MKCoordinateSpan span;
    span.latitudeDelta=0.2;
    span.longitudeDelta=0.2;

    for(PlacePin* annotation in mv.annotations){

        CLLocationCoordinate2D location;
        location.latitude = annotation.coordinate.latitude;
        location.longitude = annotation.coordinate.longitude;
        region.span=span;
        region.center=location;

        [mv setRegion:region animated:TRUE];
        [mv regionThatFits:region];

    }


}else {
    CLLocationCoordinate2D topLeftCoord;
    topLeftCoord.latitude = -90;
    topLeftCoord.longitude = 180;

    CLLocationCoordinate2D bottomRightCoord;
    bottomRightCoord.latitude = 90;
    bottomRightCoord.longitude = -180;

    for(PlacePin* annotation in mv.annotations)
    {
        topLeftCoord.longitude = fmin(topLeftCoord.longitude, annotation.coordinate.longitude);
        topLeftCoord.latitude = fmax(topLeftCoord.latitude, annotation.coordinate.latitude);

        bottomRightCoord.longitude = fmax(bottomRightCoord.longitude, annotation.coordinate.longitude);
        bottomRightCoord.latitude = fmin(bottomRightCoord.latitude, annotation.coordinate.latitude);
    }

    MKCoordinateRegion region;
    region.center.latitude = topLeftCoord.latitude - (topLeftCoord.latitude - bottomRightCoord.latitude) * 0.5;
    region.center.longitude = topLeftCoord.longitude + (bottomRightCoord.longitude - topLeftCoord.longitude) * 0.5;
    region.span.latitudeDelta = fabs(topLeftCoord.latitude - bottomRightCoord.latitude) * 1.1; // Add a little extra space on the sides
    region.span.longitudeDelta = fabs(bottomRightCoord.longitude - topLeftCoord.longitude) * 1.1; // Add a little extra space on the sides

    region = [mv regionThatFits:region];
    [mv setRegion:region animated:YES];

}

}

- (MKAnnotationView *)mapView:(MKMapView *)_mapView 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:@"I am here"];
}



return pinView;
}

2

-1
in.h file:
float address_latitude;
float address_longitude;

- (void)viewDidLoad
{

    CLLocationCoordinate2D coord1 =          CLLocationCoordinate2DMake(address_latitude,address_longitude);
    MKCoordinateSpan span = MKCoordinateSpanMake(0.0, 0.0);
    MKCoordinateRegion region1 = {coord1, span};
    MKPointAnnotation *annotation1 = [[MKPointAnnotation alloc] init];
    [annotation1 setTitle:@"Driver"];
    [annotation1 setCoordinate:coord1];
    [_map setRegion:region1];
    [_map addAnnotation:annotation1];

    }

这甚至没有回答问题。 - redent84
现在放置一个标记的示例非常好,因为原始问题是很多年前提出的。谢谢,不要介意典型的S.O.讽刺...这就是为什么我不提交答案的原因。 - eric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接