Hoe kan ik op maat pinnen toe te voegen aan de iPhone MapKit?

stemmen
15

Ik ben het testen van de MapKit kader op de iPhone en zou heel graag de standaard pen die een locatie weergeeft om een ​​afbeelding met de naam location.png te schakelen.

Hoe kan ik mijn code wijzigen om dat?

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

Dank je!

De vraag is gesteld op 23/04/2010 om 15:06
bron van user
In andere talen...                            


4 antwoorden

stemmen
25

Ik loste het na te kijken naar de bron voor MapCallouts

Hier is mijn oplossing:

- (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;
}
antwoordde op 26/04/2010 om 07:55
bron van user

stemmen
5

Gebruik deze 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;
}
antwoordde op 11/07/2012 om 06:23
bron van user

stemmen
2

Check out de MapCallouts voorbeeldcode, is er een aangepaste pin met behulp van een afbeelding in.

http://developer.apple.com/iphone/library/samplecode/MapCallouts/Introduction/Intro.html

Merk op dat als u test op OS 3.0 die je nodig hebt om te reageren uit een regel code (het zal niet bouwen totdat je dat doen).

antwoordde op 23/04/2010 om 17:54
bron van user

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

    }
antwoordde op 10/12/2014 om 13:50
bron van user

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more