通缉:如何可靠,一致地选择MKMapView注释

Joe*_*rea 30 mapkit mkpinannotationview ios

在调用MKMapViewsetCenterCoordinate:animated:方法(没有动画)后,我想调用selectAnnotation:animated :(带动画),以便从新居中的图钉中弹出注释.

现在,我只是观察mapViewDidFinishLoadingMap:然后选择注释.但是,这是有问题的.例如,当不需要加载其他地图数据时,不会调用此方法.在这些情况下,我的注释未被选中.:(

很好.我可以在设置中心坐标后立即调用它.啊,但在这种情况下,它也有可能存在地图数据加载(但还没有完成加载还).我冒险过早地调用它,动画最多也会变得不稳定.

因此,如果我理解正确,这不是知道我的坐标是否可见的问题,因为它可能几乎偏离屏幕距离并且必须加载新的地图数据.相反,它需要知道是否需要加载新的地图数据,然后相应地采取行动.

有关如何实现这一点的任何想法,或者如何在将注释生效的坐标重新定位到地图视图后以其他方式(可靠地)选择注释?

线索赞赏 - 谢谢!

小智 36

我遇到了同样的问题,但发现了一个看似可靠和合理的解决方案:

  1. 实现委托方法mapView:didAddAnnotationViews:.当我尝试在委托方法中直接选择注释时,标注随引脚丢弃!这看起来很奇怪,所以我加了一点半的延迟.

    -(void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
        [self performSelector:@selector(selectInitialAnnotation)
              withObject:nil afterDelay:0.5];
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 按照您的预期选择初始注释,但调用selectAnnotation:animated;

    -(void)selectInitialAnnotation {
        [self.mapView selectAnnotation:self.initialAnnotation animated:YES];
    }
    
    Run Code Online (Sandbox Code Playgroud)

似乎selectAnnotation:animated:在某些条件下不会调用它.与MKMapView文档比较:

如果指定的注释不在屏幕上,因此没有关联的注释视图,则此方法无效.

  • 我不得不将'@selector(selectInitialAnnotation :)'更改为'@selector(selectInitialAnnotation)'即删除冒号.我在iOS 5.1/xcode 4.2.1上 (2认同)

Anu*_*rag 7

比使用固定超时更一致的方法是收听regionDidChange回调.将地图的中心坐标设置为所需的注释,并在调用regionDidChange方法时,在中心选择注释,以打开标注.

这是我拍摄的5个引脚之间随机运行的视频.

首先,转到注释的中心坐标.假设注释对象已命名thePin.

- (void)someMethod {
    [map setCenterCoordinate:thePin.coordinate animated:YES];
}
Run Code Online (Sandbox Code Playgroud)

然后在该regionDidChange方法中,选择此注释.

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
    [map selectAnnotation:thePin animated:YES];
}
Run Code Online (Sandbox Code Playgroud)


aks*_*gde 5

那么仅供参考,这就是文档所说的,

如果指定的注释不在屏幕上,因此没有关联的注释视图,则此方法无效.

因此,如果我想调用setCenterCoordinate:animated:或者setRegion:animated:然后我想通过调用来选择注释selectAnnotation:animated:,那么注释将不会被选中,并且由于文档中上面提到的完全相同的原因而不会出现标注,所以它的方式将是很高兴有类似的东西,setCenterCoordinate:animated:ComletionBlock但它不在那里..!对我有用的方法如下,

 [UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionBeginFromCurrentState|UIViewAnimationOptionCurveEaseInOut animations:^{
        [self.mapView setCenterCoordinate:location.coordinate animated:YES];
    } completion:^(BOOL finished) {
        [self.mapView selectAnnotation:location animated:YES];
    }];
Run Code Online (Sandbox Code Playgroud)

这将为您提供一个完成块,您可以使用它来选择注释.