2009-11-26 10 views
6

Ich notiere meine Map und setze ein Bild in Ordnung, aber wenn ich auf die Annotation im MapView tippe, geht das Bild von meinem benutzerdefinierten Bild zurück zum roten Pin. Warum ist das?Warum verschwindet ein benutzerdefiniertes MKMapView-Anmerkungsbild bei Berührung?

- (MKAnnotationView *)mapView:(MKMapView *)newMapView viewForAnnotation:(id)newAnnotation { 
    MKPinAnnotationView *annotation = [[MKPinAnnotationView alloc] initWithAnnotation:newAnnotation reuseIdentifier:@"currentloc"]; 
    if (annotation == nil) { 
     annotation = [[MKAnnotationView alloc] initWithAnnotation:newAnnotation reuseIdentifier:@"currentloc"]; 
    } 

    annotation.image = [UIImage imageNamed:@"anno.png"]; 
    annotation.canShowCallout = YES; 
    annotation.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
    UIImageView *imgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bus_stop_30x30.png"]]; 
    annotation.leftCalloutAccessoryView = imgView; 

    return annotation; 
}

Mein Code sieht mit einem Beispielcode identisch aus, der dieses Problem nicht verursacht.

Antwort

17

Beantworten Sie meine eigene Frage, nur für den Fall, dass andere das gleiche Problem haben. Beachten Sie, dass ich "MKPinAnnotationView" verwende - es sollte in "MKAnnotationView" geändert werden und alles funktioniert.

Festcode:

- (MKAnnotationView *)mapView:(MKMapView *)newMapView viewForAnnotation:(id)newAnnotation { 
    MKAnnotationView *annotation = [[MKAnnotationView alloc] initWithAnnotation:newAnnotation reuseIdentifier:@"currentloc"]; 

    if (annotation == nil) { 
     annotation = [[MKAnnotationView alloc] initWithAnnotation:newAnnotation reuseIdentifier:@"currentloc"]; 
    } 

    annotation.image = [UIImage imageNamed:@"anno.png"]; 
    annotation.canShowCallout = YES; 
    annotation.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
    UIImageView *imgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bus_stop_30x30.png"]]; 
    annotation.leftCalloutAccessoryView = imgView; 

    return annotation; 
} 
+0

Dank dafür meine Zeit solution..saved .. –

0

Ich denke, das ist eine der besten Möglichkeiten ist:

(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation 
{ 
    NSLog(@"welcome into the map view annotation"); 
    MyAnnotation* myAnnotation1=annotation; 

    // if it's the user location, just return nil. 
    if ([annotation isKindOfClass:[MKUserLocation class]]) 
    return nil; 

    if([mapView isEqual:mapMainView]== NO) 
    { 
     return nil; 
    } 
    // try to dequeue an existing pin view first 
    // if ([annotation isKindOfClass:[myAnnotation1 class]]) 
    // { 

    // try to dequeue an existing pin view first 
    static NSString* AnnotationIdentifier = @"AnnotationIdentifier"; 

    MKPinAnnotationView* pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:AnnotationIdentifier]; 

    if (nil == pinView) 
    { 
     MKAnnotationView* annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation 

     reuseIdentifier:AnnotationIdentifier] autorelease]; 
     // annotationView.canShowCallout = YES; 
     // pinView.animatesDrop=YES; 
     //pinView.pinColor=MKPinAnnotationColorPurple; 

     //image 
     UIImage* flagImage = [UIImage imageNamed:@"map_marker_over2.png"]; 

     CGRect resizeRect; 

     resizeRect.size = flagImage.size; 
     CGSize maxSize = CGRectInset(self.view.bounds, 
     [MapPropertyViewController annotationPadding], 
     [MapPropertyViewController annotationPadding]).size; 
     maxSize.height -= self.navigationController.navigationBar.frame.size.height + [MapPropertyViewController calloutHeight]; 
     if (resizeRect.size.width > maxSize.width) 
     resizeRect.size = CGSizeMake(maxSize.width, resizeRect.size.height/resizeRect.size.width * maxSize.width); 
     if (resizeRect.size.height > maxSize.height) 
     resizeRect.size = CGSizeMake(resizeRect.size.width/resizeRect.size.height * maxSize.height, maxSize.height); 

     resizeRect.origin = (CGPoint){0.0f, 0.0f}; 
     UIGraphicsBeginImageContext(resizeRect.size); 
     [flagImage drawInRect:resizeRect]; 
     UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 

     annotationView.image = resizedImage; 
     annotationView.opaque = NO; 

     UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
     [rightButton setTitle:annotation.title forState:UIControlStateNormal]; 
     [rightButton addTarget:self 
     action:@selector(showDetails:) 
     forControlEvents:UIControlEventTouchUpInside]; 
     rightButton.tag = myAnnotation1.tagAnnotation; 
     annotationView.rightCalloutAccessoryView = rightButton; 

     profileIconView = [[UIImageView alloc]initWithFrame:CGRectMake(18.5f, 10.0f, 37.0f, 30.0f)]; 
     annotationView.leftCalloutAccessoryView = profileIconView; 
     //image 
     img = [UIImage imageWithData: [NSData dataWithContentsOfURL: [NSURL URLWithString:[arrImages objectAtIndex:myAnnotation1.tagAnnotation]]]]; 
     NSLog(@"Annotation Click %d",[arrImages count]); 
     NSLog(@"image %@",img); 
     profileIconView.image=img; 

     [profileIconView release]; 

     [annotationView setEnabled:YES]; 
     [annotationView setCanShowCallout:YES]; 
     return annotationView; 
    } 
    return pinView; 
    // } 
    // return nil; 
} 
+2

Können Sie eine Erklärung dafür geben? Es wird zukünftigen Lesern helfen. –

0
Try this if you want to set both Source to Destination pin images different. 

    MKPointAnnotation * sourceAnno= [[MKPointAnnotation alloc] init]; 
    sourceAnno.coordinate=CLLocationCoordinate2DMake(YourSourcelatitude,YourSourcelongitude); 
    [sourceAnno setAccessibilityLabel:@“Source”]; 
    sourceAnno.title = @“You”; 
    [mapview addAnnotation: sourceAnno]; 

    DestinationAnno = [[MKPointAnnotation alloc] init]; 
    DestinationAnno.coordinate = CLLocationCoordinate2DMake(YourDestinationlatitude,YourDestinationlongitude); 
    [DestinationAnno setAccessibilityLabel:@“Destination”]; 
    DestinationAnno.title [email protected]“Destination”; 
    [mapview addAnnotation: DestinationAnno]; 

    In Delegate Method 
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation 
{ 
    MKPointAnnotation *PointAnno=(MKPointAnnotation *)annotation; 
    NSString * kPinAnnotationIdentifier = PointAnno.accessibilityLabel; 
    MKAnnotationView *AnnotationView = [[MKAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:kPinAnnotationIdentifier]; 

    if ([kPinAnnotationIdentifier isEqualToString:@"Source"]) 
    { 
     AnnotationView.centerOffset = CGPointMake(8, -14); 
     AnnotationView.calloutOffset = CGPointMake(-8, 0); 
     AnnotationView.image = [UIImage imageNamed:@"pin_blue.png"]; 
     AnnotationView.canShowCallout = YES; 
    } 
    else if([kPinAnnotationIdentifier isEqualToString:@"Destination"]) 
    { 
     AnnotationView.centerOffset = CGPointMake(8, -14); 
     AnnotationView.calloutOffset = CGPointMake(-8, 0); 
     AnnotationView.image = [UIImage imageNamed:@"pin_red.png"]; 
     AnnotationView.canShowCallout = YES; 
    } 
    return AnnotationView; 
} 

Danke

Verwandte Themen