为什么我的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。