【问题标题】:Why does a custom MKMapView annotation image disappear on touch?为什么自定义的 MKMapView 注释图像在触摸时会消失?
【发布时间】:2010-12-20 19:48:03
【问题描述】:

我正在注释我的地图并设置图像就好了,但是当我点击 MapView 上的注释时,图像会从我的自定义图像返回到红色图钉。这是为什么呢?

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

我的代码看起来与一些不会产生此问题的示例代码相同。

【问题讨论】:

    标签: iphone annotations mapkit


    【解决方案1】:

    在这里回答我自己的问题,以防其他人有同样的问题。请注意,我正在使用“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】:

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

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

      谢谢

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多