From 150d3ffdbe7534242aa484a81ec018bdd21cd476 Mon Sep 17 00:00:00 2001 From: "Justin R. Miller" Date: Fri, 7 Feb 2014 21:18:16 -0500 Subject: [PATCH] added iOS quick zoom gesture --- ios/MBXViewController.mm | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/ios/MBXViewController.mm b/ios/MBXViewController.mm index 28033bfb5..12f577d5c 100644 --- a/ios/MBXViewController.mm +++ b/ios/MBXViewController.mm @@ -24,6 +24,7 @@ NSString *const MBXNeedsRenderNotification = @"MBXNeedsRenderNotification"; @property (nonatomic) CGPoint center; @property (nonatomic) CGFloat scale; @property (nonatomic) CGFloat angle; +@property (nonatomic) CGFloat quickZoomStart; @property (nonatomic) BOOL debug; @end @@ -112,6 +113,14 @@ class MBXMapView threeFingerLongPress.numberOfTouchesRequired = 3; [self.view addGestureRecognizer:threeFingerLongPress]; + if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) + { + UILongPressGestureRecognizer *quickZoom = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleQuickZoomGesture:)]; + quickZoom.numberOfTapsRequired = 1; + quickZoom.minimumPressDuration = 0.25; + [self.view addGestureRecognizer:quickZoom]; + } + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(startRender) name:MBXNeedsRenderNotification object:nil]; displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(render:)]; @@ -300,6 +309,28 @@ class MBXMapView [self startRender]; } +- (void)handleQuickZoomGesture:(UILongPressGestureRecognizer *)quickZoom +{ + mapView->map.cancelAnimations(); + + if (quickZoom.state == UIGestureRecognizerStateBegan) + { + self.scale = mapView->map.getScale(); + + self.quickZoomStart = [quickZoom locationInView:quickZoom.view].y; + } + else if (quickZoom.state == UIGestureRecognizerStateChanged) + { + CGFloat distance = self.quickZoomStart - [quickZoom locationInView:quickZoom.view].y; + + CGFloat newZoom = log2f(self.scale) + (distance / 100); + + mapView->map.scaleBy(powf(2, newZoom) / mapView->map.getScale(), self.view.bounds.size.width / 2, self.view.bounds.size.height / 2); + } + + [self startRender]; +} + - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { NSArray *validSimultaneousGestures = @[ [UIPanGestureRecognizer class], [UIPinchGestureRecognizer class], [UIRotationGestureRecognizer class] ];