3

我正在使用填充了自定义图钉的地图视图。当用户点击地图上的某处以取消选择引脚时,我想实现地图以使引脚不会被取消选择(即用户无法在不选择其他引脚的情况下取消选择引脚,因此始终会选择至少一个引脚)。这是我对 didDeselectAnnotationView 方法的实现:

-(void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view
{
    [mapView selectAnnotation:view.annotation animated:NO];
}

本质上,我正在尝试重新选择注释。但是,经过一些调试并打印到控制台后,我意识到注释视图实际上并没有被取消选择,直到方法 didDeselectAnnotationView: 完成运行(也就是说,事件的顺序是:用户点击地图上的某个地方,didDeselectAnnotationView: 被调用并完成执行,注释视图实际上被取消选择)。有没有其他人遇到过这个问题,或者有没有人知道另一种方法来强制执行地图的行为,这样用户就无法在不选择其他引脚的情况下取消选择引脚,从而始终选择一个引脚?

谢谢您的帮助。

4

5 回答 5

11

尝试将重新选择推迟到didDeselectAnnotationView完成之后:

-(void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view
{
    [self performSelector:@selector(reSelectAnnotationIfNoneSelected:) 
            withObject:view.annotation afterDelay:0];
}

- (void)reSelectAnnotationIfNoneSelected:(id<MKAnnotation>)annotation
{
    if (mapView.selectedAnnotations.count == 0)
        [mapView selectAnnotation:annotation animated:NO];
}
于 2011-08-03T19:54:43.847 回答
1

编辑:请记住,此方法可防止选择任何其他引脚,这在创建此答案时是未知的。很有可能,这不是您想要的行为。

我知道这是一个老问题,但接受的答案在 iOS 8 中对我不起作用。对我有用的是完全禁用 UITapGestureRecognizer,默认情况下,它包含在 MKMapView 中。

- (void)disableTapRecognizerForMapView:(MKMapView *)mapView {
    NSArray *a = [[self.mapView.subviews objectAtIndex:0] gestureRecognizers];

    for (id gesture in a)
        if ([gesture isKindOfClass:[UITapGestureRecognizer class]])
            [gesture setEnabled:NO];
}

希望这对其他人有帮助。

干杯!

于 2015-04-04T19:55:55.420 回答
0

我有一个类似的问题,但反过来。

根据选择的引脚,表格将滚动到相应的单元格。如果未选择任何引脚,则表格将滚动回第一个单元格。正在调用取消选择方法的同时在选择另一个引脚时调用SELECT方法并且表格不会根据需要滚动。

以下代码解决了该问题,并对 Anna 的解决方案进行了轻微修改。

- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKPinAnnotationView *)view
{
   if ([view.annotation isKindOfClass:[MKUserLocation class]]) 
        return;

    [self performSelector:@selector(resetTableScroll:) 
           withObject:view.annotation afterDelay:.5];
    }



- (void)resetTableScroll:(id<MKAnnotation>)annotation{

    if (theMap.selectedAnnotations.count == 0)
    {
        NSIndexPath *position = [NSIndexPath indexPathForRow:0 inSection:0];
        [[self theTable] scrollToRowAtIndexPath:position atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
    }}
于 2012-05-07T00:46:54.277 回答
0

安娜的精彩回答。这是 Swift 3 或 4 中的答案:D

func mapView(_ mapView: MKMapView, didDeselect view: MKAnnotationView) {
    perform(#selector(MyViewController.reSelectAnnotationIfNoneSelected(_:)), with: view.annotation, afterDelay: 0)
}

func reSelectAnnotationIfNoneSelected(_ annotation: MKAnnotation) {
    if mapView.selectedAnnotations.count == 0 {
        mapView.selectAnnotation(annotation, animated: false)
    }
}
于 2017-07-07T15:00:09.393 回答
0

如果您为地图视图添加手势,请尝试以下操作:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;

返回 NO,它有效

于 2018-03-09T07:17:29.560 回答