2011-08-22 13 views
16

Jak wyświetlać zdjęcia zamiast szpilek na mapie. Do tej pory mogę dodawać tylko szpilki z kranu. Przykładowy kod .m bardzo pomógłby, ponieważ wciąż nie jestem w programowaniu na iOS.Szpilki niestandardowe iOS MapKit

+1

Trochę wyszukiwania przechodzi długą drogę :) http://stackoverflow.com/questions/4579397/iphone-mapkit-adding-custom-image-and-pins-to-annotations a także: http://stackoverflow.com/questions/7124028/change-pin-design –

Odpowiedz

53
#pragma mark - 
#pragma mark MKMapView delegate 
- (MKAnnotationView *)mapView:(MKMapView *)mapview viewForAnnotation:(id <MKAnnotation>)annotation 
{ 
    if ([annotation isKindOfClass:[MKUserLocation class]]) 
     return nil; 
    static NSString* AnnotationIdentifier = @"AnnotationIdentifier"; 
    MKAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:AnnotationIdentifier]; 
    if(annotationView) 
     return annotationView; 
    else 
    { 
     MKAnnotationView *annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation 
                     reuseIdentifier:AnnotationIdentifier] autorelease]; 
     annotationView.canShowCallout = YES; 
     annotationView.image = [UIImage imageNamed:@"someImage.png"]; 
     UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
     [rightButton addTarget:self action:@selector(writeSomething:) forControlEvents:UIControlEventTouchUpInside]; 
     [rightButton setTitle:annotation.title forState:UIControlStateNormal]; 
     annotationView.rightCalloutAccessoryView = rightButton; 
     annotationView.canShowCallout = YES; 
     annotationView.draggable = YES; 
     return annotationView; 
    } 
    return nil; 
} 

EDIT:

mogę wyjaśnić wszystko o MKAnnotationView, ale myślę, że można znaleźć w dokumentacji dostarczonej przez firmę Apple, aby być o wiele lepsze wytłumaczenie niż z jakiegokolwiek innego źródła. Sprawdź sekcję przeglądu w linku.

https://developer.apple.com/documentation/mapkit/mkannotationview

+0

to działa. dzięki. Czy mógłbyś podać krótkie wyjaśnienie parametrów, które przeszły i jaki jest identyfikator adnotacji? czy to jest podobne do właściwości znacznika .net? – Bahamut

+0

Zamiast używać "someImage.png", w moim wymaganiu, muszę narysować na UIView i przy użyciu [adnotationView addSubView: myView]. Działa dobrze. Ale nie wywołanie "didSelectAnnotationView" na jego czubku. Nic złego? – Satyam

+0

Może być konieczne wyłączenie interakcji użytkownika z tym widokiem. – Robin

6

idź do organizatora Xcode, a następnie przejść do dokumentacji i szukanie weatherMap pokazuje przykład na mapie z tym obrazy z adnotacją.

0
#pragma mark - 
#pragma mark MKMapView delegate 
-(void)addAllPinsOnMapView 
{ 



MKCoordinateRegion region = mapViewOffer.region; 
region.center = CLLocationCoordinate2DMake(12.9752297537231, 80.2313079833984); 
region.span.longitudeDelta= 0.1f; 
region.span.latitudeDelta= 0.1f; 
[mapViewOffer setRegion:region animated:YES]; 






mapViewOffer.delegate=self; 
arrMapPin=[[NSMutableArray alloc] init]; 
NSArray *name=[[NSArray alloc]initWithObjects: 
       @"Title1", 
       @"Title2", 
       @"Title3", nil]; 

NSMutableArray *arrCoordinateStr = [[NSMutableArray alloc] initWithCapacity:name.count]; 
[arrCoordinateStr addObject:@"12.970760345459,80.2190093994141"]; 
[arrCoordinateStr addObject:@"12.9752297537231,80.2313079833984"]; 
[arrCoordinateStr addObject:@"12.9788103103638,80.2412414550781"]; 

for(int i = 0; i < name.count; i++) 
{ 
    NSArray *components = [[arrCoordinateStr objectAtIndex:i] componentsSeparatedByString:@","]; 
    double latitude = [components[0] doubleValue]; 
    double longitude = [components[1] doubleValue]; 

    MKPointAnnotation *mapPin = [[MKPointAnnotation alloc] init]; 
    CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(latitude, longitude); 
    mapPin.title = [name objectAtIndex:i]; 
    mapPin.coordinate = coordinate; 
    [mapViewOffer addAnnotation:mapPin]; 
} 
} 
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView: 
(MKAnnotationView *)view 
{ 
NSLog(@"%@",view.annotation.title); 
NSLog(@"%f",view.annotation.coordinate.latitude); 
NSLog(@"%f",view.annotation.coordinate.longitude); 

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(calloutTapped:)]; 
[view addGestureRecognizer:tapGesture]; 

} 
-(void)calloutTapped:(UITapGestureRecognizer *) sender 
{ 
NSLog(@"Callout was tapped"); 

MKAnnotationView *view = (MKAnnotationView*)sender.view; 
id <MKAnnotation> annotation = [view annotation]; 
if ([annotation isKindOfClass:[MKPointAnnotation class]]) 
{ 
    //[self performSegueWithIdentifier:@"annotationDetailSegue" sender:annotation]; 
    OfferDetailsViewController *objOfferDetailsViewController = [[OfferDetailsViewController alloc]init]; 
    [self.navigationController pushViewController:objOfferDetailsViewController animated:YES]; 
} 
} 
- (MKAnnotationView *)mapView:(MKMapView *)theMapView 
viewForAnnotation:(id <MKAnnotation>)annotation 
{ 
MKAnnotationView *pinView = nil; 
static NSString *defaultPinID = @"annotationViewID"; 
pinView = (MKAnnotationView *)[mapViewOffer dequeueReusableAnnotationViewWithIdentifier:defaultPinID]; 
if (pinView == nil){ 
    pinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:defaultPinID]; 
} 

pinView.canShowCallout = YES; 
pinView.image = [UIImage imageNamed:@"placeholder"]; 


UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
[infoButton addTarget:self action:@selector(infoButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; 
pinView.rightCalloutAccessoryView = infoButton; 

return pinView; 
} 
+0

dodaj kilka opisów przed opublikowaniem długiego fragmentu kodu. –

Powiązane problemy