2010-04-23 15 views
15

Ich teste das MapKit-Framework auf dem iPhone aus und würde wirklich gerne den Standard-Pin, der einen Ort anzeigt, auf ein Bild namens "location.png" umstellen.Wie füge ich dem iPhone MapKit benutzerdefinierte Pins hinzu?

Wie kann ich meinen Code ändern, um dies zu ermöglichen?

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 

Thank you!

Antwort

25

Ich löste es nach für MapCallouts an der Quelle suchen

Hier ist meine Lösung:

- (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

es Sie ändern müssen mapView → Karte scheint – Cfr

+0

@Christoffer die Wetterkarte Verbindung unterbrochen wird – Caipivara

+0

Als Alternative zu der Broken WeatherMap Link, ein relevanter Apple Doc: https://developer.apple.com/library/mac/documentation/UserExperience/Conceptual/LocationAwarenessPG/AnnotingMaps/Annota tingMaps.html – SimplGy

5

Verwendung Dieser Code

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; 
} 
-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]; 

    } 
+0

Dies beantwortet nicht einmal die Frage – redent84

+0

Großartiges Beispiel für das Fallenlassen eines Pins, wie die ursprüngliche Frage vor vielen Jahren war. Danke und entschuldige den typischen S.O. schnarrt ... Deshalb gebe ich keine Antworten ab. – eric

Verwandte Themen