Iphone MKMapView,animateDrop?
我已经设置了一个NSMutableArray对象,这些对象派生自一个符合MKAnnotation协议的类。我已为注释设置了标题和副标题,并已使用以下方法成功地将其添加到MKMapView中:Iphone MKMapView,animateDrop?,iphone,objective-c,cocoa-touch,Iphone,Objective C,Cocoa Touch,我已经设置了一个NSMutableArray对象,这些对象派生自一个符合MKAnnotation协议的类。我已为注释设置了标题和副标题,并已使用以下方法成功地将其添加到MKMapView中: [[self customMapView] addAnnotations:locationArray]; 我现在想做的是设置插针下落的动画,最初我认为我可以使用选项1来实现,使用该选项,一切都正常,但插针不会进行动画下落 // Option1 // WORKS FOR: pinColor YES, ani
[[self customMapView] addAnnotations:locationArray];
我现在想做的是设置插针下落的动画,最初我认为我可以使用选项1来实现,使用该选项,一切都正常,但插针不会进行动画下落
// 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];
}
}
我的下一个猜测是尝试选项2,这似乎效果很好,但我有两个问题。标题和副标题没有显示,我的自定义注释对象正在传入(我可以在调试器中看到它),但包含的信息没有传递到新的pin
。其次,这将创建一组新的mkAnnotationView,旧的会发生什么,是否存在内存泄漏问题
// 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;
}
//选项2
//对于:pinColor是,AnimateDrop是,标签号
-(MKAnnotationView*)地图视图:(MKMapView*)地图视图注释:(id)注释{
MKPinAnnotationView*pin=(MKPinAnnotationView*)[mapView出列可重用AnnotationViewWithIdentifier:@“annotation_ID”];
如果(引脚==零){
pin=[[MKPinAnnotationView alloc]initWithAnnotation:annotation重用标识符:@“annotation\u ID”]autorelease];
}否则{
pin.annotation=注释;
}
pin.pinColor=MKPinAnnotationColorRed;
pin.animatesDrop=是;
回位销;
}
编辑:我已通过添加
pin.canShowCallout=YES解决了缺少的标题和副标题代码>MKPinAnnotationView是MKAnnotationView的子类
MKAnnotationView是一种通用的注释视图,如果需要,必须为其提供图像和动画
MKPinAnnotationView是MKAnnotationView的一个方便的子类,它自动提供选定颜色的管脚图像和管脚掉落到地图上的动画。在viewForAnnotation中创建视图时,可以设置animatesDrop属性,它将从此处自动处理动画
如果未实现viewForAnnotation,则会显示没有动画的标准红色pin
调用didAddAnnotationViews时,自动动画已经发生,设置该属性没有任何效果
但是,如果要创建不同于MKPinAnnotationView提供的默认放置动画的自定义动画,可以在DidAddAnnotationView中执行此操作。视图将已经位于其最终目标点,因此您可以保存该点,然后将其从另一个点设置到该目标的动画
如果您对MKPinAnnotationView提供的默认放置动画感到满意,则不需要实现DidAddAnnotationView。当所有注释视图实际就位时,该委托方法对于执行可能需要执行的其他操作更为有用
要使PIN显示标题,请将canShowCallout
设置为YES
,在此处设置animatesDrop
不确定“这将创建一组新的mkAnnotationView”是什么意思。在viewForAnnotation方法中,为MKAnnotation对象提供一个视图(MKPinAnnotationView)。它们不是一回事
此外,viewForAnnotation方法的工作原理与UITableView的cellForRowAtIndexPath方法类似,其中注释视图可以循环使用,这就是为什么每次在视图中设置MKAnnotation特定信息(例如注释属性)都很重要的原因。这是我能找到的最简单的解决方案。它所做的是在viewDidLoad事件中在UIMapView上放置一个管脚
该项目参考了MapKit
framework
该视图具有以下导入:#导入
视图控制器实现MKMapViewDelegate
协议
视图控制器实现包含:
viewDidLoad包含:
更新Swift3:
func映射视图(\mapView:MKMapView,viewforannotation:MKAnnotation)->MKAnnotationView?{
如果注释是MKUserLocation{
归零
}
让pinAnnotation=MKPinAnnotationView(注释:注释,重用标识符:“pinAnnotation”)
pinAnnotation.pinTintColor=.green;
pinAnnotation.animatesDrop=true;
pinAnnotation.canShowCallout=false;
pinAnnotation.setSelected(真,动画:真)
返回pinAnnotation
}
谢谢aBitObvoius,一个完美的答案。关于MKAnnotationViews,我感到困惑的是,如果你不实现viewForAnnotation(在这里你会得到默认的红色引脚),那么可能已经有一个MKAnnotationView在某处创建了,通过随后实现它,我可能需要对旧的一个做些什么。好的,通过实现viewForAnnotation,您正在覆盖默认视图,因此没有重复。明白了,非常感谢,再次感谢您提供了非常有用的答案。在选项2代码中,创建pin时,不会设置批注。我会删除“else”并缩进pin.annotation=annotation行,以便始终设置它。在viewForAnnotation:,您应该使用mapView.dequeueReusableAnnotationViewWithIdentifier,就像您在tableView中使用dequeueReusableCellWithIdentifier一样。否则,您将继续使用实际不重用的重用标识符创建mkannotation。您在viewForAnnotation中选择annotation,这似乎毫无意义。
- (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];