Authored by Justin R. Miller

Merge branch 'develop' of github.com:mapbox/mapbox-ios-sdk into develop

... ... @@ -162,6 +162,8 @@
UIViewController *_viewControllerPresentingAttribution;
UIButton *_attributionButton;
BOOL _userAlteringPanOrZoom;
}
@synthesize decelerationMode = _decelerationMode;
... ... @@ -400,13 +402,13 @@
_delegate = aDelegate;
_delegateHasBeforeMapMove = [_delegate respondsToSelector:@selector(beforeMapMove:)];
_delegateHasAfterMapMove = [_delegate respondsToSelector:@selector(afterMapMove:)];
_delegateHasBeforeMapMove = [_delegate respondsToSelector:@selector(beforeMapMove:byUser:)];
_delegateHasAfterMapMove = [_delegate respondsToSelector:@selector(afterMapMove:byUser:)];
_delegateHasBeforeMapZoom = [_delegate respondsToSelector:@selector(beforeMapZoom:)];
_delegateHasAfterMapZoom = [_delegate respondsToSelector:@selector(afterMapZoom:)];
_delegateHasBeforeMapZoom = [_delegate respondsToSelector:@selector(beforeMapZoom:byUser:)];
_delegateHasAfterMapZoom = [_delegate respondsToSelector:@selector(afterMapZoom:byUser:)];
_delegateHasMapViewRegionDidChange = [_delegate respondsToSelector:@selector(mapViewRegionDidChange:)];
_delegateHasMapViewRegionDidChange = [_delegate respondsToSelector:@selector(mapViewRegionDidChange:byUser:)];
_delegateHasDoubleTapOnMap = [_delegate respondsToSelector:@selector(doubleTapOnMap:at:)];
_delegateHasSingleTapOnMap = [_delegate respondsToSelector:@selector(singleTapOnMap:at:)];
... ... @@ -593,7 +595,7 @@
- (void)setCenterProjectedPoint:(RMProjectedPoint)centerProjectedPoint animated:(BOOL)animated
{
if (_delegateHasBeforeMapMove)
[_delegate beforeMapMove:self];
[_delegate beforeMapMove:self byUser:_userAlteringPanOrZoom];
// RMLog(@"Current contentSize: {%.0f,%.0f}, zoom: %f", mapScrollView.contentSize.width, mapScrollView.contentSize.height, self.zoom);
... ... @@ -609,7 +611,7 @@
// RMLog(@"setMapCenterProjectedPoint: {%f,%f} -> {%.0f,%.0f}", centerProjectedPoint.x, centerProjectedPoint.y, mapScrollView.contentOffset.x, mapScrollView.contentOffset.y);
if (_delegateHasAfterMapMove && !animated)
[_delegate afterMapMove:self];
[_delegate afterMapMove:self byUser:_userAlteringPanOrZoom];
[self correctPositionOfAllAnnotations];
}
... ... @@ -619,7 +621,7 @@
- (void)moveBy:(CGSize)delta
{
if (_delegateHasBeforeMapMove)
[_delegate beforeMapMove:self];
[_delegate beforeMapMove:self byUser:_userAlteringPanOrZoom];
CGPoint contentOffset = _mapScrollView.contentOffset;
contentOffset.x += delta.width;
... ... @@ -627,7 +629,7 @@
_mapScrollView.contentOffset = contentOffset;
if (_delegateHasAfterMapMove)
[_delegate afterMapMove:self];
[_delegate afterMapMove:self byUser:_userAlteringPanOrZoom];
}
#pragma mark -
... ... @@ -1076,14 +1078,19 @@
if (self.userTrackingMode != RMUserTrackingModeNone)
self.userTrackingMode = RMUserTrackingModeNone;
_userAlteringPanOrZoom = YES;
if (_delegateHasBeforeMapMove)
[_delegate beforeMapMove:self];
[_delegate beforeMapMove:self byUser:_userAlteringPanOrZoom];
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
if (!decelerate && _delegateHasAfterMapMove)
[_delegate afterMapMove:self];
[_delegate afterMapMove:self byUser:_userAlteringPanOrZoom];
if (!decelerate)
_userAlteringPanOrZoom = NO;
}
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView
... ... @@ -1095,21 +1102,25 @@
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
if (_delegateHasAfterMapMove)
[_delegate afterMapMove:self];
[_delegate afterMapMove:self byUser:_userAlteringPanOrZoom];
_userAlteringPanOrZoom = NO;
}
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
{
if (_delegateHasAfterMapMove)
[_delegate afterMapMove:self];
[_delegate afterMapMove:self byUser:_userAlteringPanOrZoom];
}
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view
{
_mapScrollViewIsZooming = YES;
_userAlteringPanOrZoom = (scrollView.pinchGestureRecognizer.state == UIGestureRecognizerStateBegan);
if (_delegateHasBeforeMapZoom)
[_delegate beforeMapZoom:self];
[_delegate beforeMapZoom:self byUser:_userAlteringPanOrZoom];
}
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale
... ... @@ -1121,7 +1132,9 @@
- (void)scrollViewDidZoom:(UIScrollView *)scrollView
{
if (self.userTrackingMode != RMUserTrackingModeNone && scrollView.pinchGestureRecognizer.state == UIGestureRecognizerStateChanged)
_userAlteringPanOrZoom = (scrollView.pinchGestureRecognizer.state == UIGestureRecognizerStateChanged);
if (self.userTrackingMode != RMUserTrackingModeNone && _userAlteringPanOrZoom)
self.userTrackingMode = RMUserTrackingModeNone;
[self correctPositionOfAllAnnotations];
... ... @@ -1130,7 +1143,7 @@
self.userTrackingMode = RMUserTrackingModeFollow;
if (_delegateHasAfterMapZoom)
[_delegate afterMapZoom:self];
[_delegate afterMapZoom:self byUser:_userAlteringPanOrZoom];
}
// Detect dragging/zooming
... ... @@ -1269,7 +1282,7 @@
// Don't do anything stupid here or your scrolling experience will suck
if (_delegateHasMapViewRegionDidChange)
[_delegate mapViewRegionDidChange:self];
[_delegate mapViewRegionDidChange:self byUser:_userAlteringPanOrZoom];
}
#pragma mark - Gesture Recognizers and event handling
... ... @@ -2595,8 +2608,12 @@
userHeadingTrackingView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"HeadingAngleSmall.png"]];
userHeadingTrackingView.center = CGPointMake(round([self bounds].size.width / 2),
round([self bounds].size.height / 2) - (userHeadingTrackingView.bounds.size.height / 2) - 4);
userHeadingTrackingView.frame = CGRectMake((self.bounds.size.width / 2) - (userHeadingTrackingView.bounds.size.width / 2),
(self.bounds.size.height / 2) - userHeadingTrackingView.bounds.size.height,
userHeadingTrackingView.bounds.size.width,
userHeadingTrackingView.bounds.size.height * 2);
userHeadingTrackingView.contentMode = UIViewContentModeTop;
userHeadingTrackingView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin |
UIViewAutoresizingFlexibleRightMargin |
... ... @@ -2775,7 +2792,7 @@
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading
{
if ( ! showsUserLocation || _mapScrollView.isDragging)
if ( ! showsUserLocation || _mapScrollView.isDragging || newHeading.headingAccuracy < 0)
return;
userLocation.heading = newHeading;
... ... @@ -2786,16 +2803,40 @@
if (newHeading.trueHeading != 0 && self.userTrackingMode == RMUserTrackingModeFollowWithHeading)
{
[CATransaction begin];
[CATransaction setAnimationDuration:1.0];
[CATransaction setAnimationDuration:0.5];
[CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[UIView animateWithDuration:1.0
[UIView animateWithDuration:0.5
delay:0.0
options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationCurveEaseInOut
animations:^(void)
{
CGFloat angle = (M_PI / -180) * newHeading.trueHeading;
switch ([[UIApplication sharedApplication] statusBarOrientation])
{
case (UIInterfaceOrientationLandscapeLeft):
{
angle -= 90 * (M_PI / -180);
break;
}
case (UIInterfaceOrientationLandscapeRight):
{
angle += 90 * (M_PI / -180);
break;
}
case (UIInterfaceOrientationPortraitUpsideDown):
{
angle += M_PI;
break;
}
case (UIInterfaceOrientationPortrait):
default:
{
break;
}
}
_mapScrollView.transform = CGAffineTransformMakeRotation(angle);
_overlayView.transform = CGAffineTransformMakeRotation(angle);
... ...
... ... @@ -45,11 +45,11 @@ typedef enum : NSUInteger {
- (void)mapView:(RMMapView *)mapView willHideLayerForAnnotation:(RMAnnotation *)annotation;
- (void)mapView:(RMMapView *)mapView didHideLayerForAnnotation:(RMAnnotation *)annotation;
- (void)beforeMapMove:(RMMapView *)map;
- (void)afterMapMove:(RMMapView *)map;
- (void)beforeMapMove:(RMMapView *)map byUser:(BOOL)wasUserAction;
- (void)afterMapMove:(RMMapView *)map byUser:(BOOL)wasUserAction;
- (void)beforeMapZoom:(RMMapView *)map;
- (void)afterMapZoom:(RMMapView *)map;
- (void)beforeMapZoom:(RMMapView *)map byUser:(BOOL)wasUserAction;
- (void)afterMapZoom:(RMMapView *)map byUser:(BOOL)wasUserAction;
/*
\brief Tells the delegate that the region displayed by the map view just changed.
... ... @@ -57,7 +57,7 @@ typedef enum : NSUInteger {
During scrolling and zooming, this method may be called many times to report updates to the map position.
Therefore, your implementation of this method should be as lightweight as possible to avoid affecting scrolling and zooming performance.
*/
- (void)mapViewRegionDidChange:(RMMapView *)mapView;
- (void)mapViewRegionDidChange:(RMMapView *)mapView byUser:(BOOL)wasUserAction;
- (void)doubleTapOnMap:(RMMapView *)map at:(CGPoint)point;
- (void)singleTapOnMap:(RMMapView *)map at:(CGPoint)point;
... ...
... ... @@ -135,8 +135,8 @@
NSURL *imageURL = [NSURL URLWithString:[NSString stringWithFormat:@"http://a.tiles.mapbox.com/v3/marker/pin-%@%@%@%@.png",
(sizeString ? [sizeString substringToIndex:1] : @"m"),
(symbolName ? [@"-" stringByAppendingString:symbolName] : nil),
(colorHex ? [@"+" stringByAppendingString:[colorHex stringByReplacingOccurrencesOfString:@"#" withString:@""]] : nil),
(symbolName ? [@"-" stringByAppendingString:symbolName] : @""),
(colorHex ? [@"+" stringByAppendingString:[colorHex stringByReplacingOccurrencesOfString:@"#" withString:@""]] : @""),
(useRetina ? @"@2x" : @"")]];
UIImage *image;
... ...