我已经设置了一个从符合NSMutableArray协议的类派生的对象的MKAnnotation。我设置了注释的设置标题和副标题,并使用以下方法成功地将它们添加到MKMapView中:
[[self customMapView] addAnnotations:locationArray];我现在要做的是动画的插脚下降,最初我认为我可以用Option1,使用这一切工作,但引脚不做动画下降。
// Option1
// WORKS FOR: pinColor YES, animatesDrop NO, LABEL YES
- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
for(MKPinAnnotationView *eachView in views) {
[eachView setAnimatesDrop:YES];
[eachView setPinColor:MKPinAnnotationColorPurple];
}
}我的下一个猜测是尝试Option2,这看起来很好,但我有两个问题。标题和副标题不显示,我的自定义注释对象将被传入(我可以在调试器中看到它),但是包含的信息并没有传递给新的pin。其次,这会创建一组新的MKAnnotationViews,旧的会发生什么,内存泄漏有什么问题吗?
// Option2
//FOR: pinColor YES, animatesDrop YES, LABEL NO
- (MKAnnotationView *) mapView: (MKMapView *) mapView viewForAnnotation: (id<MKAnnotation>) annotation {
MKPinAnnotationView *pin = (MKPinAnnotationView *) [mapView dequeueReusableAnnotationViewWithIdentifier: @"annotation_ID"];
if (pin == nil) {
pin = [[[MKPinAnnotationView alloc] initWithAnnotation: annotation reuseIdentifier: @"annotation_ID"] autorelease];
} else {
pin.annotation = annotation;
}
pin.pinColor = MKPinAnnotationColorRed;
pin.animatesDrop = YES;
return pin;
}编辑:我通过添加subTitle解决了缺少的标题& pin.canShowCallout = YES;
发布于 2011-01-17 16:38:57
MKPinAnnotationView是MKAnnotationView的子类。
MKAnnotationView是一个通用的注释视图,如果需要的话,您必须为其提供图像和动画。
MKPinAnnotationView是MKAnnotationView的一个方便的子类,它会自动提供一个选定颜色的引脚图像和一个插入到地图上的引脚动画。当在animatesDrop中创建视图时,您可以设置viewForAnnotation属性,它将从那里自动处理动画。
如果不实现viewForAnnotation,则会显示一个没有动画的标准红色引脚。
在调用didAddAnnotationViews时,自动动画已经发生,并且设置该属性没有任何效果。
但是,如果您希望创建一个与MKPinAnnotationView提供的默认下拉动画不同的自定义动画,则可以在didAddAnnotationViews中这样做。视图将已经位于其最终目的点,因此您保存该视图,然后将其从一个不同的点动画到该目的地。
如果您对MKPinAnnotationView提供的默认drop动画感到满意,则不需要实现didAddAnnotationViews。当所有注释视图实际到位时,该委托方法对于执行其他您可能需要做的事情更为有用。
要使您的引脚显示标题,请将canShowCallout设置为设置animatesDrop的YES。
不清楚您所说的“这会创建一组新的MKAnnotationViews”是什么意思。在viewForAnnotation方法中,您为MKAnnotation对象提供了一个视图(MKPinAnnotationView)。它们不是一回事。
而且,viewForAnnotation方法的工作方式类似于UITableView的cellForRowAtIndexPath方法,其中注释视图可以被回收,这就是为什么每次在视图中设置特定于MKAnnotation的信息(例如注释属性)是很重要的。
发布于 2011-03-08 15:28:50
这是我能找到的最简单的解决方案。它所做的是在UIMapView事件中在viewDidLoad事件中放置一个引脚。
import:#import <MapKit/MapKit.h>
MapKit框架MKMapViewDelegate协议G 212
- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id ) annotation
{
MKPinAnnotationView *newAnnotation = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"annotation1"];
newAnnotation.pinColor = MKPinAnnotationColorGreen;
newAnnotation.animatesDrop = YES;
newAnnotation.canShowCallout = NO;
[newAnnotation setSelected:YES animated:YES];
return newAnnotation;
}CLLocationCoordinate2D geos = CLLocationCoordinate2DMake(0.2344, 45.324);
MKPlacemark* marker = [[MKPlacemark alloc] initWithCoordinate:geos addressDictionary:nil];
[mapView addAnnotation:marker];
[marker release];发布于 2017-06-20 06:18:47
更新Swift3:
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
if annotation is MKUserLocation {
return nil
}
let pinAnnotation = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "PinAnnotation")
pinAnnotation.pinTintColor = .green;
pinAnnotation.animatesDrop = true;
pinAnnotation.canShowCallout = false;
pinAnnotation.setSelected(true, animated: true)
return pinAnnotation
}https://stackoverflow.com/questions/4713821
复制相似问题