カスタムMKMapViewアノテーション画像がタッチで消えるのはなぜですか?

StackOverflow https://stackoverflow.com/questions/1805897

  •  05-07-2019
  •  | 
  •  

質問

地図に注釈を付けて画像を適切に設定していますが、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;
}

私のコードは、この問題を引き起こさないいくつかのサンプルコードと同一に見えます。

役に立ちましたか?

解決

他の人が同じ問題を抱えている場合に備えて、ここで自分の質問に答えます。 「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;
}

他のヒント

これは最良の方法の1つだと思います:

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

ありがとう

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top