From f2ff4895b9dbd2130b6823cdb31a420ecb2812eb Mon Sep 17 00:00:00 2001 From: "Justin R. Miller" Date: Thu, 27 Mar 2014 15:05:55 -0700 Subject: [PATCH] clean up cryptic iOS gestures & add command palette for commands --- README.md | 6 +- ios/MBXViewController.mm | 141 ++++++++++++++++++++++---------------- ios/img/resetPosition.png | Bin 0 -> 7332 bytes ios/img/toggleDebug.png | Bin 0 -> 10524 bytes ios/img/toggleRaster.png | Bin 0 -> 4966 bytes ios/img/unrotate.png | Bin 0 -> 8217 bytes 6 files changed, 84 insertions(+), 63 deletions(-) create mode 100644 ios/img/resetPosition.png create mode 100644 ios/img/toggleDebug.png create mode 100644 ios/img/toggleRaster.png create mode 100644 ios/img/unrotate.png diff --git a/README.md b/README.md index c730f949b..8fdf2800a 100644 --- a/README.md +++ b/README.md @@ -130,7 +130,5 @@ This is automatically taken care of as a build phase if you are using the Xcode - Use two fingers to rotate - Double-tap to zoom in one level - Two-finger single-tap to zoom out one level -- Long-press to reset north -- Two-finger long press to reset the transform -- Three-finger long press to toggle debug information -- Four-finger long press to toggle raster +- Single-tap to toggle the command palette visibility for resetting north & the transform, toggling debug, and toggling raster +- Double-tap, long-pressing the second, then pan up and down to "quick zoom" (iPhone only, meant for one-handed use) diff --git a/ios/MBXViewController.mm b/ios/MBXViewController.mm index 7cc616c0e..3cdab5ffd 100644 --- a/ios/MBXViewController.mm +++ b/ios/MBXViewController.mm @@ -29,6 +29,7 @@ NSString *const MBXUpdateActivityNotification = @"MBXUpdateActivityNotification" @property (nonatomic) CGFloat angle; @property (nonatomic) CGFloat quickZoomStart; @property (nonatomic) BOOL debug; +@property (nonatomic) UIView *palette; @end @@ -102,29 +103,20 @@ class MBXMapView rotate.delegate = self; [self.view addGestureRecognizer:rotate]; + UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTapGesture:)]; + singleTap.numberOfTapsRequired = 1; + [self.view addGestureRecognizer:singleTap]; + UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTapGesture:)]; doubleTap.numberOfTapsRequired = 2; [self.view addGestureRecognizer:doubleTap]; + [singleTap requireGestureRecognizerToFail:doubleTap]; + UITapGestureRecognizer *twoFingerTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTwoFingerTapGesture:)]; twoFingerTap.numberOfTouchesRequired = 2; [self.view addGestureRecognizer:twoFingerTap]; - UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPressGesture:)]; - [self.view addGestureRecognizer:longPress]; - - UILongPressGestureRecognizer *twoFingerLongPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleTwoFingerLongPressGesture:)]; - twoFingerLongPress.numberOfTouchesRequired = 2; - [self.view addGestureRecognizer:twoFingerLongPress]; - - UILongPressGestureRecognizer *threeFingerLongPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleThreeFingerLongPressGesture:)]; - threeFingerLongPress.numberOfTouchesRequired = 3; - [self.view addGestureRecognizer:threeFingerLongPress]; - - UILongPressGestureRecognizer *fourFingerLongPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleFourFingerLongPressGesture:)]; - fourFingerLongPress.numberOfTouchesRequired = 4; - [self.view addGestureRecognizer:fourFingerLongPress]; - if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { UILongPressGestureRecognizer *quickZoom = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleQuickZoomGesture:)]; @@ -142,6 +134,76 @@ class MBXMapView displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(render:)]; [displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; + + NSArray *selectorNames = @[ @"unrotate", @"resetPosition", @"toggleDebug", @"toggleRaster" ]; + CGFloat buttonSize = 40; + CGFloat bufferSize = 20; + CGFloat alpha = 0.75; + CGFloat paletteWidth = buttonSize + (2 * bufferSize); + CGFloat paletteHeight = [selectorNames count] * (buttonSize + bufferSize) + bufferSize; + self.palette = [[UIView alloc] initWithFrame:CGRectMake(self.view.bounds.size.width - paletteWidth, + (self.view.bounds.size.height - paletteHeight) / 2, + paletteWidth, + paletteHeight)]; + self.palette.backgroundColor = [UIColor colorWithWhite:0 alpha:alpha]; + self.palette.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin; + self.palette.layer.cornerRadius = bufferSize; + [self.view addSubview:self.palette]; + for (NSString *selectorName in selectorNames) + { + UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; + button.frame = CGRectMake(bufferSize, + ([selectorNames indexOfObject:selectorName] * (buttonSize + bufferSize)) + bufferSize, + buttonSize, + buttonSize); + [button setImage:[UIImage imageNamed:[selectorName stringByAppendingString:@".png"]] forState:UIControlStateNormal]; + [button addTarget:self action:NSSelectorFromString(selectorName) forControlEvents:UIControlEventTouchUpInside]; + [self.palette addSubview:button]; + } +} + +- (void)togglePalette +{ + if (self.palette.alpha < 1) + { + self.palette.userInteractionEnabled = YES; + + [UIView animateWithDuration:0.25 animations:^(void) + { + self.palette.alpha = 1; + }]; + } + else + { + self.palette.userInteractionEnabled = NO; + + [UIView animateWithDuration:0.25 animations:^(void) + { + self.palette.alpha = 0; + }]; + } +} + +- (void)unrotate +{ + mapView->map.resetNorth(); +} + +- (void)resetPosition +{ + mapView->map.resetPosition(); +} + +- (void)toggleDebug +{ + mapView->map.toggleDebug(); + + self.debug = ! self.debug; +} + +- (void)toggleRaster +{ + mapView->map.toggleRaster(); } - (void)dealloc @@ -310,6 +372,11 @@ class MBXMapView [self updateRender]; } +- (void)handleSingleTapGesture:(UITapGestureRecognizer *)singleTap +{ + [self togglePalette]; +} + - (void)handleDoubleTapGesture:(UITapGestureRecognizer *)doubleTap { mapView->map.cancelAnimations(); @@ -330,50 +397,6 @@ class MBXMapView [self updateRender]; } -- (void)handleLongPressGesture:(UILongPressGestureRecognizer *)longPress -{ - mapView->map.cancelAnimations(); - - if (longPress.state == UIGestureRecognizerStateBegan) - mapView->map.resetNorth(); - - [self updateRender]; -} - -- (void)handleTwoFingerLongPressGesture:(UILongPressGestureRecognizer *)twoFingerLongPress -{ - mapView->map.cancelAnimations(); - - if (twoFingerLongPress.state == UIGestureRecognizerStateBegan) - mapView->map.resetPosition(); - - [self updateRender]; -} - -- (void)handleThreeFingerLongPressGesture:(UILongPressGestureRecognizer *)threeFingerLongPress -{ - mapView->map.cancelAnimations(); - - if (threeFingerLongPress.state == UIGestureRecognizerStateBegan) - { - mapView->map.toggleDebug(); - - self.debug = ! self.debug; - } - - [self updateRender]; -} - -- (void)handleFourFingerLongPressGesture:(UILongPressGestureRecognizer *)fourFingerLongPress -{ - mapView->map.cancelAnimations(); - - if (fourFingerLongPress.state == UIGestureRecognizerStateBegan) - mapView->map.toggleRaster(); - - [self updateRender]; -} - - (void)handleQuickZoomGesture:(UILongPressGestureRecognizer *)quickZoom { mapView->map.cancelAnimations(); diff --git a/ios/img/resetPosition.png b/ios/img/resetPosition.png new file mode 100644 index 0000000000000000000000000000000000000000..81269cd4fb534244e60c6e7ed4e5756ec749b93a GIT binary patch literal 7332 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 cJSTx4P(BF#-Vc(kfC_62>3@3opCA$^ZZW literal 0 HcmV?d00001 diff --git a/ios/img/toggleDebug.png b/ios/img/toggleDebug.png new file mode 100644 index 0000000000000000000000000000000000000000..aa5e3042fb93137c367ac0d8f403917d1bb6c6bc GIT binary patch literal 10524 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 literal 0 HcmV?d00001 diff --git a/ios/img/unrotate.png b/ios/img/unrotate.png new file mode 100644 index 0000000000000000000000000000000000000000..63361e99d8082aeeaacec8330eba503954e6c9eb GIT binary patch literal 8217 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