代码之家  ›  专栏  ›  技术社区  ›  dc.

为什么自定义mkmapview注释图像在触摸时消失?

  •  6
  • dc.  · 技术社区  · 15 年前

    我正在注释地图并设置一个图像,但当我点击地图视图上的注释时,图像将从我的自定义图像返回到红针。为什么会这样?

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

    我的代码看起来与一些不产生这个问题的示例代码完全相同。

    3 回复  |  直到 10 年前
        1
  •  17
  •   dc.    11 年前

    在这里回答我自己的问题,以防万一别人也有同样的问题。请注意,我使用的是“mkpinannotationview”-应该将其更改为“mkannotationview”,并且一切正常。

    固定代码:

    - (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;
    }
    
        2
  •  0
  •   eeerahul Arrj    13 年前

    我认为这是最好的方法之一:

    (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;
    }
    
        3
  •  0
  •   jbchitaliya    10 年前
        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 =@“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;
    }
    

    谢谢你