diff --git a/platform/ios/MGLMapView.mm b/platform/ios/MGLMapView.mm index 8593e9da5..96ae0b5c2 100644 --- a/platform/ios/MGLMapView.mm +++ b/platform/ios/MGLMapView.mm @@ -703,6 +703,8 @@ mbgl::DefaultFileSource *mbglFileSource = nullptr; [self unrotateIfNeededAnimated:YES]; + [self snapCompassIfNeeded]; + [self notifyMapChange:@(mbgl::MapChangeRegionDidChangeAnimated)]; } } @@ -1710,7 +1712,7 @@ CLLocationCoordinate2D latLngToCoordinate(mbgl::LatLng latLng) return (self.zoomLevel > 3); } -// correct rotations to north as needed +// correct rotations to north as needed at low zooms // - (void)unrotateIfNeededAnimated:(BOOL)animated { @@ -1884,6 +1886,22 @@ CLLocationCoordinate2D latLngToCoordinate(mbgl::LatLng latLng) } } +// reset north on very small gesture-induced angles +// +- (void)snapCompassIfNeeded +{ + double degrees = mbglMap->getBearing() * -1; + while (degrees >= 360) degrees -= 360; + while (degrees < 0) degrees += 360; + + double tolerance = 7; + + if (self.compass.alpha > 0 && (degrees < tolerance || degrees > 360 - tolerance)) + { + [self resetNorthAnimated:YES]; + } +} + + (UIImage *)resourceImageNamed:(NSString *)imageName { if ( ! [[imageName pathExtension] length])