Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone MKMapView,animateDrop?_Iphone_Objective C_Cocoa Touch - Fatal编程技术网

Iphone MKMapView,animateDrop?

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

我已经设置了一个NSMutableArray对象,这些对象派生自一个符合MKAnnotation协议的类。我已为注释设置了标题和副标题,并已使用以下方法成功地将其添加到MKMapView中:

[[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];