自定义双击放大MKMapView(Uber like)

时间:2014-03-12 21:58:43

标签: ios objective-c mkmapview uitapgesturerecognizer

当我双击MKMapView时,我正试图达到与优步应用相同的效果。

它不会放大用户点击的点,而是放在地图的当前中心。

这是我到目前为止所尝试的内容:

  • 删除原始双击手势识别器
  • 添加我自己的手势识别器,可自行处理缩放

但是,即使删除原始的双击手势识别器似乎也能正常工作,我的新手势识别器选择器也不会被触发。

- (void)viewDidLoad
{
    [self removeDefaultDoubleTapToZoomGestureRecognizer];
    [self addCustomDoubleTapToZoomGestureRecognizer];
}

- (void)removeDefaultDoubleTapToZoomGestureRecognizer
{
    [self findAndRemoveDefaultDoubleTapToZoomInView:self.map];
}

- (void)findAndRemoveDefaultDoubleTapToZoomInView:(UIView *)view
{
    NSArray *gestureRecognizers = view.gestureRecognizers;
    for (UIGestureRecognizer *gestureRecognizer in gestureRecognizers)
    {
        if ([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]])
        {
            UITapGestureRecognizer *tapGestureRecognizer = (UITapGestureRecognizer *)gestureRecognizer;
            if (tapGestureRecognizer.numberOfTapsRequired == 2 && tapGestureRecognizer.numberOfTouchesRequired == 1)
            {
                [view removeGestureRecognizer:tapGestureRecognizer];
            }
        }
    }

    for (UIView *subView in view.subviews)
    {
        [self findAndRemoveDefaultDoubleTapToZoomInView:subView];
    }
}

- (void)addCustomDoubleTapRecognizer
{
    UIView *view = self.mapView;
    UITapGestureRecognizer *gestureRecognizer = self.customDoubleTapGestureRecognizer;

    [view addGestureRecognizer:gestureRecognizer];
}

- (IBAction)customDoubleTapGestureRecognizerTapped:(UITapGestureRecognizer *)sender
{
    NSLog(@"double tap");
}

已从IB添加customDoubleTapGestureRegonizer属性和-customDoubleTapGestureRecognizerTapped:方法。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:4)

我正在做一些与你非常相似的事情,它对我有用。如果可能,我会从IB中删除双击识别器逻辑,而是从addCustomDoubleTapRecognizer实施中手动添加它

- (void)addCustomDoubleTapRecognizer {
  UIView *view = self.mapView;

  UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(zoomInGesture)];
  [view addGestureRecognizer:gestureRecognizer];
  gestureRecognizer.numberOfTapsRequired = 2;
}

然后添加zoomInGesture方法,例如

- (void)zoomInGesture {
  MKCoordinateRegion region = self.mapView.region;
  MKCoordinateSpan span = self.mapView.region.span;
  span.latitudeDelta *= 0.5;
  span.longitudeDelta *= 0.5;
  region.span = span;
  [self.mapView setRegion:region animated:YES];
}

它适用于我,当用户双击地图上的任何地方时,它会放大当前地图中心。

答案 1 :(得分:1)

您确定customDoubleTapGestureRecognizer已正确初始化了吗?

BTW我不喜欢这种方法。你不知道它是如何在内部实现的(在MKMapView中),你的代码可以在以后的任何更新中中断,等等。我会添加空的UIView叠加层(与{{1}相同的帧) })使用双击手势识别器,以免弄乱MKMapView内部。

相关问题