通缉:如何可靠、一致地选择 MKMapView 注释
-
12-09-2019 - |
题
打电话后 MK地图视图的 设置中心坐标:动画: 方法(没有动画),我想调用 选择注释:动画: (带有动画)以便注释从新居中的图钉中弹出。
现在,我只是关注 mapViewDidFinishLoadingMap: 然后选择注释。然而,这是有问题的。例如,当不需要加载额外的地图数据时,不会调用此方法。在这些情况下,我的注释不会被选中。 :(
很好。我可以在设置中心坐标后立即调用它。啊啊,不过那样的话也有可能 是 要加载的地图数据(但尚未完成加载)。我可能会冒险过早地调用它,因为动画充其量会变得参差不齐。
因此,如果我理解正确,那么知道我的坐标是否可见并不是问题,因为有可能会偏离几乎一屏的距离并且必须加载新的地图数据。相当, 问题在于了解是否需要加载新的地图数据,然后采取相应的行动。
有关如何实现此目的的任何想法,或者如何在将地图视图重新集中在注释所在坐标上后以其他方式(可靠地)选择注释?
感谢线索 - 谢谢!
解决方案
我遇到了同样的问题,但找到了一个似乎可靠且合理的解决方案:
实现委托方法mapView:didAddAnnotationViews:。当我尝试直接在委托方法中选择注释时,标注随引脚一起掉落!这看起来很奇怪,所以我添加了半秒的轻微延迟。
-(void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views { [self performSelector:@selector(selectInitialAnnotation) withObject:nil afterDelay:0.5]; }
按照您的预期选择初始注释,但调用 selectAnnotation:animated;
-(void)selectInitialAnnotation { [self.mapView selectAnnotation:self.initialAnnotation animated:YES]; }
看起来 selectAnnotation:animated:
在某些条件下不会被调用。与之比较 MKMapView 文档:
如果指定的注释不在屏幕上,因此没有关联的注释视图,则该方法没有效果。
其他提示
不是使用固定的超时的更一致的方式是听regionDidChange
回调。设置地图的中心坐标为所需的注释,并且当regionDidChange方法被调用,那么在中心选择注释,以打开标注。
这里有一个小影片我花了5针之间随机运行的东西。
首先,后藤注释的中心坐标。比方说在注释对象被命名为thePin
。
- (void)someMethod {
[map setCenterCoordinate:thePin.coordinate animated:YES];
}
然后在regionDidChange
方法,选择该注释。
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
[map selectAnnotation:thePin animated:YES];
}
也只是FYI,这就是文档说什么,
如果指定的注释是不在屏幕上,并因此不 具有相关联的注释图,该方法将不起作用。
所以,如果我想打电话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];
}];
这会给你完成块和u可以用它来选择所述注释
对我有用的是打电话 selectAnnotation:animated:
来自 mapView:didAddAnnotationViews:
方法:
- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views;
{
[mapView selectAnnotation:[[mapView annotations] lastObject] animated:YES];
}
苹果文档也有同样的内容 这里.
请注意,我在地图上只有一个注释,因此 [[mapView annotations] lastObject]
适合我的目的。你的旅费可能会改变。
我有类似的问题。我用的是默认MKPinAnnotationView与animatesDrop:YES。后我添加的附加说明的MKMapView,我这样做:
[mapView selectAnnotation:[mapView.annotations objectAtIndex:1] animated:YES]
这在我的程序的逻辑,应当选择最近的注释。这是行不通的。我想通了原因:注解的观点是不是在这个选择调用时在屏幕上,因为针掉在地上的动画。所以,我所做的只是设置一个计时器来选择注释的第二个版本。这是一个黑客,但它的作品。我不知道这是否会在任何情况下工作,虽然,例如在3G与3Gs的。它最好能够找出正确的回调函数,把它放在
selectTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self
selector:@selector(selectClosestAnnotation) userInfo:nil
repeats:NO];
- (void)selectClosestAnnotation {
[mapView selectAnnotation:[mapView.annotations objectAtIndex:1]
animated:YES];
}
我发现我的问题的所有解决方案都存在几个问题(我想在从 viewDidAppear 添加注释时选择一个注释):
使用
mapView:didAddAnnotationViews:
委托方法。这对我不起作用,因为如果指定的注释不在屏幕上,因此没有关联的注释视图,则此方法无效。
使用
mapViewDidFinishLoadingMap:
委托方法。这对我来说也不起作用,因为地图现在已缓存,因此该方法仅在第一次调用一次。
解决方案:
约翰·布莱克本(John Blackburn)非常接近,但没有 mapView:didAddAnnotationViews:
方法。我只调用我自己的 selectAnnotation:
方法,在添加注释之前,有延迟:
[self.mapView addAnnotation:ann];
[self performSelector:@selector(selectAnnotation:) withObject:ann afterDelay:0.5];
这就是我在我的工作中所做的 selectAnnotation:
方法:
- (void)selectAnnotation:(id < MKAnnotation >)annotation
{
[self.mapView selectAnnotation:annotation animated:YES];
}
在两台 iPhone 3GS(iOS 5 和 6)和一台 iPhone 5 上进行了测试。
我有类似的困难,但实际上不能使这种方法在所有的工作,更不用说不一致。
下面是我找到的工作。也许这会为你工作了: 如何触发MKAnnotationView的标注视图,而不触及销?