为什么我的MKPointAnnotation不是自定义的?

我的MKPointAnnotation应该与这个代码是自定义的:

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

然而,由于某种原因,Pin仍然是默认的,任何人都可以帮我在这里? 谢谢

你不应该自己调用viewForAnnotation 。 您应该只添加注释到您的地图视图,然后确定哪些在任何给定的时刻可见,并为您调用viewForAnnotation 。 从而:

  • 鉴于不同的注释可以有不同的图像,你真的想要子类MKPointAnnotation并给它一个imageName的属性(注意,不是UIImage本身,而是一个名称或标识符, viewForAnnotation可以用来创buildUIImage本身):

     @interface MyAnnotation : MKPointAnnotation @property(nonatomic, strong) NSString *imageName; @end @implementation MyAnnotation @end 
  • 添加一个注释(不是注解视图)到你的地图视图,例如:

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

    注意,我不会build议把Pin作为一个类的ivar /属性,我会使用camelCase作为variables名(以小写开头),我setAnnotation方法名从setAnnotation更改为addAnnotationWithTitle等。

  • 确保你的控制器已经被指定为mapView的委托;

  • viewForAnnotation将被调用(如果注解是可见的)。 它可能应该是这样的:

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

    请注意, MKPinAnnotationView是一个MKPinAnnotationView选项,您无法使用自定义批注视图。 但是如果你愿意的话,很容易实现(参见我怎样使用MKAnnotationView创build一个自定义的“pin-drop”animation )。 我build议你先解决基本的注释视图,然后再看看自定义注释视图放置animation。