Authored by Justin R. Miller

refs #61: indicate when pan or zoom driven by user action

@@ -162,6 +162,8 @@ @@ -162,6 +162,8 @@
162 162
163 UIViewController *viewControllerPresentingAttribution; 163 UIViewController *viewControllerPresentingAttribution;
164 UIButton *attributionButton; 164 UIButton *attributionButton;
  165 +
  166 + BOOL _userAlteringPanOrZoom;
165 } 167 }
166 168
167 @synthesize decelerationMode = _decelerationMode; 169 @synthesize decelerationMode = _decelerationMode;
@@ -400,13 +402,13 @@ @@ -400,13 +402,13 @@
400 402
401 _delegate = aDelegate; 403 _delegate = aDelegate;
402 404
403 - _delegateHasBeforeMapMove = [_delegate respondsToSelector:@selector(beforeMapMove:)];  
404 - _delegateHasAfterMapMove = [_delegate respondsToSelector:@selector(afterMapMove:)]; 405 + _delegateHasBeforeMapMove = [_delegate respondsToSelector:@selector(beforeMapMove:byUser:)];
  406 + _delegateHasAfterMapMove = [_delegate respondsToSelector:@selector(afterMapMove:byUser:)];
405 407
406 - _delegateHasBeforeMapZoom = [_delegate respondsToSelector:@selector(beforeMapZoom:)];  
407 - _delegateHasAfterMapZoom = [_delegate respondsToSelector:@selector(afterMapZoom:)]; 408 + _delegateHasBeforeMapZoom = [_delegate respondsToSelector:@selector(beforeMapZoom:byUser:)];
  409 + _delegateHasAfterMapZoom = [_delegate respondsToSelector:@selector(afterMapZoom:byUser:)];
408 410
409 - _delegateHasMapViewRegionDidChange = [_delegate respondsToSelector:@selector(mapViewRegionDidChange:)]; 411 + _delegateHasMapViewRegionDidChange = [_delegate respondsToSelector:@selector(mapViewRegionDidChange:byUser:)];
410 412
411 _delegateHasDoubleTapOnMap = [_delegate respondsToSelector:@selector(doubleTapOnMap:at:)]; 413 _delegateHasDoubleTapOnMap = [_delegate respondsToSelector:@selector(doubleTapOnMap:at:)];
412 _delegateHasSingleTapOnMap = [_delegate respondsToSelector:@selector(singleTapOnMap:at:)]; 414 _delegateHasSingleTapOnMap = [_delegate respondsToSelector:@selector(singleTapOnMap:at:)];
@@ -593,7 +595,7 @@ @@ -593,7 +595,7 @@
593 - (void)setCenterProjectedPoint:(RMProjectedPoint)centerProjectedPoint animated:(BOOL)animated 595 - (void)setCenterProjectedPoint:(RMProjectedPoint)centerProjectedPoint animated:(BOOL)animated
594 { 596 {
595 if (_delegateHasBeforeMapMove) 597 if (_delegateHasBeforeMapMove)
596 - [_delegate beforeMapMove:self]; 598 + [_delegate beforeMapMove:self byUser:_userAlteringPanOrZoom];
597 599
598 // RMLog(@"Current contentSize: {%.0f,%.0f}, zoom: %f", mapScrollView.contentSize.width, mapScrollView.contentSize.height, self.zoom); 600 // RMLog(@"Current contentSize: {%.0f,%.0f}, zoom: %f", mapScrollView.contentSize.width, mapScrollView.contentSize.height, self.zoom);
599 601
@@ -609,7 +611,7 @@ @@ -609,7 +611,7 @@
609 // RMLog(@"setMapCenterProjectedPoint: {%f,%f} -> {%.0f,%.0f}", centerProjectedPoint.x, centerProjectedPoint.y, mapScrollView.contentOffset.x, mapScrollView.contentOffset.y); 611 // RMLog(@"setMapCenterProjectedPoint: {%f,%f} -> {%.0f,%.0f}", centerProjectedPoint.x, centerProjectedPoint.y, mapScrollView.contentOffset.x, mapScrollView.contentOffset.y);
610 612
611 if (_delegateHasAfterMapMove && !animated) 613 if (_delegateHasAfterMapMove && !animated)
612 - [_delegate afterMapMove:self]; 614 + [_delegate afterMapMove:self byUser:_userAlteringPanOrZoom];
613 615
614 [self correctPositionOfAllAnnotations]; 616 [self correctPositionOfAllAnnotations];
615 } 617 }
@@ -619,7 +621,7 @@ @@ -619,7 +621,7 @@
619 - (void)moveBy:(CGSize)delta 621 - (void)moveBy:(CGSize)delta
620 { 622 {
621 if (_delegateHasBeforeMapMove) 623 if (_delegateHasBeforeMapMove)
622 - [_delegate beforeMapMove:self]; 624 + [_delegate beforeMapMove:self byUser:_userAlteringPanOrZoom];
623 625
624 CGPoint contentOffset = _mapScrollView.contentOffset; 626 CGPoint contentOffset = _mapScrollView.contentOffset;
625 contentOffset.x += delta.width; 627 contentOffset.x += delta.width;
@@ -627,7 +629,7 @@ @@ -627,7 +629,7 @@
627 _mapScrollView.contentOffset = contentOffset; 629 _mapScrollView.contentOffset = contentOffset;
628 630
629 if (_delegateHasAfterMapMove) 631 if (_delegateHasAfterMapMove)
630 - [_delegate afterMapMove:self]; 632 + [_delegate afterMapMove:self byUser:_userAlteringPanOrZoom];
631 } 633 }
632 634
633 #pragma mark - 635 #pragma mark -
@@ -1079,14 +1081,19 @@ @@ -1079,14 +1081,19 @@
1079 if (self.userTrackingMode != RMUserTrackingModeNone) 1081 if (self.userTrackingMode != RMUserTrackingModeNone)
1080 self.userTrackingMode = RMUserTrackingModeNone; 1082 self.userTrackingMode = RMUserTrackingModeNone;
1081 1083
  1084 + _userAlteringPanOrZoom = YES;
  1085 +
1082 if (_delegateHasBeforeMapMove) 1086 if (_delegateHasBeforeMapMove)
1083 - [_delegate beforeMapMove:self]; 1087 + [_delegate beforeMapMove:self byUser:_userAlteringPanOrZoom];
1084 } 1088 }
1085 1089
1086 - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 1090 - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
1087 { 1091 {
1088 if (!decelerate && _delegateHasAfterMapMove) 1092 if (!decelerate && _delegateHasAfterMapMove)
1089 - [_delegate afterMapMove:self]; 1093 + [_delegate afterMapMove:self byUser:_userAlteringPanOrZoom];
  1094 +
  1095 + if (!decelerate)
  1096 + _userAlteringPanOrZoom = NO;
1090 } 1097 }
1091 1098
1092 - (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView 1099 - (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView
@@ -1098,21 +1105,25 @@ @@ -1098,21 +1105,25 @@
1098 - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 1105 - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
1099 { 1106 {
1100 if (_delegateHasAfterMapMove) 1107 if (_delegateHasAfterMapMove)
1101 - [_delegate afterMapMove:self]; 1108 + [_delegate afterMapMove:self byUser:_userAlteringPanOrZoom];
  1109 +
  1110 + _userAlteringPanOrZoom = NO;
1102 } 1111 }
1103 1112
1104 - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView 1113 - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
1105 { 1114 {
1106 if (_delegateHasAfterMapMove) 1115 if (_delegateHasAfterMapMove)
1107 - [_delegate afterMapMove:self]; 1116 + [_delegate afterMapMove:self byUser:_userAlteringPanOrZoom];
1108 } 1117 }
1109 1118
1110 - (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view 1119 - (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view
1111 { 1120 {
1112 _mapScrollViewIsZooming = YES; 1121 _mapScrollViewIsZooming = YES;
1113 1122
  1123 + _userAlteringPanOrZoom = (scrollView.pinchGestureRecognizer.state == UIGestureRecognizerStateBegan);
  1124 +
1114 if (_delegateHasBeforeMapZoom) 1125 if (_delegateHasBeforeMapZoom)
1115 - [_delegate beforeMapZoom:self]; 1126 + [_delegate beforeMapZoom:self byUser:_userAlteringPanOrZoom];
1116 } 1127 }
1117 1128
1118 - (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale 1129 - (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale
@@ -1124,7 +1135,9 @@ @@ -1124,7 +1135,9 @@
1124 1135
1125 - (void)scrollViewDidZoom:(UIScrollView *)scrollView 1136 - (void)scrollViewDidZoom:(UIScrollView *)scrollView
1126 { 1137 {
1127 - if (self.userTrackingMode != RMUserTrackingModeNone && scrollView.pinchGestureRecognizer.state == UIGestureRecognizerStateChanged) 1138 + _userAlteringPanOrZoom = (scrollView.pinchGestureRecognizer.state == UIGestureRecognizerStateChanged);
  1139 +
  1140 + if (self.userTrackingMode != RMUserTrackingModeNone && _userAlteringPanOrZoom)
1128 self.userTrackingMode = RMUserTrackingModeNone; 1141 self.userTrackingMode = RMUserTrackingModeNone;
1129 1142
1130 [self correctPositionOfAllAnnotations]; 1143 [self correctPositionOfAllAnnotations];
@@ -1133,7 +1146,7 @@ @@ -1133,7 +1146,7 @@
1133 self.userTrackingMode = RMUserTrackingModeFollow; 1146 self.userTrackingMode = RMUserTrackingModeFollow;
1134 1147
1135 if (_delegateHasAfterMapZoom) 1148 if (_delegateHasAfterMapZoom)
1136 - [_delegate afterMapZoom:self]; 1149 + [_delegate afterMapZoom:self byUser:_userAlteringPanOrZoom];
1137 } 1150 }
1138 1151
1139 // Detect dragging/zooming 1152 // Detect dragging/zooming
@@ -1272,7 +1285,7 @@ @@ -1272,7 +1285,7 @@
1272 1285
1273 // Don't do anything stupid here or your scrolling experience will suck 1286 // Don't do anything stupid here or your scrolling experience will suck
1274 if (_delegateHasMapViewRegionDidChange) 1287 if (_delegateHasMapViewRegionDidChange)
1275 - [_delegate mapViewRegionDidChange:self]; 1288 + [_delegate mapViewRegionDidChange:self byUser:_userAlteringPanOrZoom];
1276 } 1289 }
1277 1290
1278 #pragma mark - Gesture Recognizers and event handling 1291 #pragma mark - Gesture Recognizers and event handling
@@ -45,11 +45,11 @@ typedef enum { @@ -45,11 +45,11 @@ typedef enum {
45 - (void)mapView:(RMMapView *)mapView willHideLayerForAnnotation:(RMAnnotation *)annotation; 45 - (void)mapView:(RMMapView *)mapView willHideLayerForAnnotation:(RMAnnotation *)annotation;
46 - (void)mapView:(RMMapView *)mapView didHideLayerForAnnotation:(RMAnnotation *)annotation; 46 - (void)mapView:(RMMapView *)mapView didHideLayerForAnnotation:(RMAnnotation *)annotation;
47 47
48 -- (void)beforeMapMove:(RMMapView *)map;  
49 -- (void)afterMapMove:(RMMapView *)map; 48 +- (void)beforeMapMove:(RMMapView *)map byUser:(BOOL)wasUserAction;
  49 +- (void)afterMapMove:(RMMapView *)map byUser:(BOOL)wasUserAction;
50 50
51 -- (void)beforeMapZoom:(RMMapView *)map;  
52 -- (void)afterMapZoom:(RMMapView *)map; 51 +- (void)beforeMapZoom:(RMMapView *)map byUser:(BOOL)wasUserAction;
  52 +- (void)afterMapZoom:(RMMapView *)map byUser:(BOOL)wasUserAction;
53 53
54 /* 54 /*
55 \brief Tells the delegate that the region displayed by the map view just changed. 55 \brief Tells the delegate that the region displayed by the map view just changed.
@@ -57,7 +57,7 @@ typedef enum { @@ -57,7 +57,7 @@ typedef enum {
57 During scrolling and zooming, this method may be called many times to report updates to the map position. 57 During scrolling and zooming, this method may be called many times to report updates to the map position.
58 Therefore, your implementation of this method should be as lightweight as possible to avoid affecting scrolling and zooming performance. 58 Therefore, your implementation of this method should be as lightweight as possible to avoid affecting scrolling and zooming performance.
59 */ 59 */
60 -- (void)mapViewRegionDidChange:(RMMapView *)mapView; 60 +- (void)mapViewRegionDidChange:(RMMapView *)mapView byUser:(BOOL)wasUserAction;
61 61
62 - (void)doubleTapOnMap:(RMMapView *)map at:(CGPoint)point; 62 - (void)doubleTapOnMap:(RMMapView *)map at:(CGPoint)point;
63 - (void)singleTapOnMap:(RMMapView *)map at:(CGPoint)point; 63 - (void)singleTapOnMap:(RMMapView *)map at:(CGPoint)point;