拖动我的 MKAnnotationView 后拖动地图不会移动 MKAnnotationView

Posted

技术标签:

【中文标题】拖动我的 MKAnnotationView 后拖动地图不会移动 MKAnnotationView【英文标题】:Dragging the map after dragging my MKAnnotationView does not move the MKAnnotationView with it 【发布时间】:2013-09-26 20:05:31 【问题描述】:

MKPinAnnotationView 不允许您将自定义图像用作“pin”并同时启用拖动,因为一旦您开始拖动,图像就会变回默认 pin。因此我使用 MKAnnotationView 而不是 MKPinAnnotationView。

虽然使用 MKAnnotationView 而不是 MKPinAnnotationView 确实让您的自定义图像显示为您的“pin”,但它不支持您使用默认 pin 获得的拖放动画。

无论如何,我的问题是,在我将自定义 MKAnnotationView 拖到地图上的新点然后移动地图本身之后,MKAnnotationView 不再随地图移动。

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation 
    static NSString *defaultID = @"myLocation";

    if([self.annotation isKindOfClass:[PinAnnotation class]])
    
        //Try to get an unused annotation, similar to uitableviewcells
        MKAnnotationView *annotationView = [self.mapView dequeueReusableAnnotationViewWithIdentifier:defaultID];

        //If one isn't available, create a new one
        if(!annotationView)
        
            annotationView = [[MKAnnotationView alloc] initWithAnnotation:self.annotation reuseIdentifier:defaultID];
            annotationView.canShowCallout = YES;
            annotationView.draggable = YES;
            annotationView.enabled = YES;
        
        UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, 32, 32)];
        imgView.image = self.passableTag.image;
        annotationView.leftCalloutAccessoryView = imgView;
        annotationView.image = [UIImage imageNamed:[Constants tagIconImageNameForTagType:self.passableTag.type]];
        return annotationView;
    
    return nil;

【问题讨论】:

您允许用户在任何时候将多少个PinAnnotations 放在地图上? @Craig 只有一个。 【参考方案1】:

结束拖拽后将 annotationView.dragState 设置为 MKAnnotationViewDragStateNone 即可:

    - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view didChangeDragState:(MKAnnotationViewDragState)newState fromOldState:(MKAnnotationViewDragState)oldState 
        if ([view.annotation isKindOfClass:[PinAnnotation class]]) 
            if (newState == MKAnnotationViewDragStateEnding) 
                view.dragState = MKAnnotationViewDragStateNone;
            
        
    

【讨论】:

这正是我需要的修复方法 - 将 MKAnnotationView 的 dragState 设置为 MKAnnotationViewDragStateNone。这并不明显,因为这是一个委托方法,您会期望处理状态更改的调用代码将更新此属性。似乎是 ios 7 中引入的 Apple 错误,因为我无法在 iOS 6 上重现。【参考方案2】:

我遇到了同样的问题,我将“setDragState”添加到我的 MKAnnotationView 类中解决了它。

This 是一个旧的解决方案,但它对我有用 (iOS8)。

【讨论】:

【参考方案3】:

不要重复使用 MKAnnotationView,它会起作用。

【讨论】:

以上是关于拖动我的 MKAnnotationView 后拖动地图不会移动 MKAnnotationView的主要内容,如果未能解决你的问题,请参考以下文章

拖动时更新 MKPointAnnotation 对象

用手指使 UIView 可拖动

在地图视图上拖动注释图钉

在被拖动后如何将可拖动对象保持在其位置?

React,如何防止在拖动后执行单击事件?

jQuery - 窗口滚动后的可拖动位置问题