Why is my MKPointAnnotation not Custom?

时光总嘲笑我的痴心妄想 提交于 2019-12-21 05:06:41

问题


My MKPointAnnotation should with this code be custom:

-(MKPointAnnotation*)setAnnotation: (NSString*) title atLocation:(CLLocationCoordinate2D)Location withImage:(UIImage*) LocationImage{
    Pin = [[MKPointAnnotation alloc] init];
    Pin.title = title;
    [Pin setCoordinate:Location];
    [self mapView:mapView viewForAnnotation:Pin].annotation = Pin;
    return Pin;
}



-(MKAnnotationView *)mapView: (MKMapView *)mapView viewForAnnotation: (id<MKAnnotation>) annotation{

        MKPinAnnotationView* pinView = (MKPinAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"CustomPinAnnotationView"];


        if(!pinView){
            pinView = [[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:@"CustomPinAnnotationView"];
            pinView.animatesDrop = YES;
            pinView.canShowCallout = YES;
            pinView.enabled = YES;
            UIButton *PicButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
            [PicButton addTarget:self action:@selector(showLocationPicture) forControlEvents:UIControlEventTouchUpInside];\
            pinView.rightCalloutAccessoryView = PicButton;
        }
        else{
            pinView.annotation = annotation;
        }
    return pinView;
}

Yet, for some reason, the Pin is still default, can anyone help me out here? Thanks


回答1:


You shouldn't call viewForAnnotation yourself. You should only add annotations to your map view, which will then determine which are visible at any given moment and call viewForAnnotation for you. Thus:

  • Given that different annotations can have different images, you really want to subclass MKPointAnnotation and give it a property of the imageName (note, not the UIImage itself, but a name or identifier that viewForAnnotation will be able to use to create the UIImage itself):

    @interface MyAnnotation : MKPointAnnotation
    @property(nonatomic, strong) NSString *imageName;
    @end
    
    @implementation MyAnnotation
    @end
    
  • Add an annotation (not an annotation view) to your mapview, e.g.:

    - (id<annotation>)addAnnotationWithTitle:(NSString *)title coordinate:(CLLocationCoordinate2D)coordinate imageName:(NSString *)imageName
    {
        MyAnnotation *annotation = [[MyAnnotation alloc] init];
        annotation.title = title;
        annotation.coordinate = coordinate;
        annotation.imageName = imageName;
        [mapView addAnnotation:annotation];
        return annotation;
    }
    

    Note, I wouldn't suggest making Pin a class ivar/property, and I'd use camelCase for variable names (start with lowercase), I'd change the method name from setAnnotation to something like addAnnotationWithTitle, etc.

  • Make sure your controller has been specified as the delegate of the mapView;

  • The viewForAnnotation will be called for you (if the annotation is visible). It should probably be something like:

    - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
    {
        if ([annotation isKindOfClass:[MKUserLocation class]])
            return nil;
    
        if ([annotation isKindOfClass:[MyAnnotation class]])
        {
            MyAnnotation *customAnnotation = annotation;
    
            static NSString *annotationIdentifier = @"MyAnnotation";
            MKAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier];
            if (!annotationView)
            {
                annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:annotationIdentifier];
                annotationView.canShowCallout = YES;
                annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
            }
            else
            {
                annotationView.annotation = annotation;
            }
    
            annotationView.image = [UIImage imageNamed:customAnnotation.imageName];
    
            return annotationView;
        }
    
        return nil;
    }
    

    Note, the animatesDrop is a MKPinAnnotationView option that you can't do with custom annotation views. But it's easy to implement one if you want it (see How can I create a custom "pin-drop" animation using MKAnnotationView?). I'd suggest you tackle the basic annotation view first, and then look at custom annotation view drop animation later.



来源:https://stackoverflow.com/questions/16507171/why-is-my-mkpointannotation-not-custom

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!