diff options
author | Jason Wray <jason@mapbox.com> | 2017-08-30 12:35:20 -0400 |
---|---|---|
committer | Jason Wray <jason@mapbox.com> | 2017-09-07 19:23:29 -0400 |
commit | 99616e662704f3c778d002fc711ec1288fd6d142 (patch) | |
tree | 0150330f84ddb7003d17cf615565721ab230791b /platform/ios/src | |
parent | c35b1cd56ba8f4a3d4f195237e025bb24bfa4c43 (diff) | |
download | qtlocation-mapboxgl-99616e662704f3c778d002fc711ec1288fd6d142.tar.gz |
[ios] Introduce MGLUserLocationHeadingIndicator protocol
Diffstat (limited to 'platform/ios/src')
5 files changed, 50 insertions, 19 deletions
diff --git a/platform/ios/src/MGLFaux3DUserLocationAnnotationView.m b/platform/ios/src/MGLFaux3DUserLocationAnnotationView.m index ee45865b0a..158bb01d8e 100644 --- a/platform/ios/src/MGLFaux3DUserLocationAnnotationView.m +++ b/platform/ios/src/MGLFaux3DUserLocationAnnotationView.m @@ -2,8 +2,9 @@ #import "MGLMapView.h" #import "MGLUserLocation.h" -#import "MGLUserLocationHeadingBeamLayer.h" +#import "MGLUserLocationHeadingIndicator.h" #import "MGLUserLocationHeadingArrowLayer.h" +#import "MGLUserLocationHeadingBeamLayer.h" @implementation MGLFaux3DUserLocationAnnotationView { @@ -12,14 +13,13 @@ CALayer *_puckDot; CAShapeLayer *_puckArrow; - MGLUserLocationHeadingBeamLayer *_headingIndicatorLayer; - //MGLUserLocationHeadingArrowLayer *_headingIndicatorLayer; + CALayer<MGLUserLocationHeadingIndicator> *_headingIndicatorLayer; CALayer *_accuracyRingLayer; CALayer *_dotBorderLayer; CALayer *_dotLayer; CALayer *_haloLayer; - double _oldHeadingAccuracy; + CLLocationDirection _oldHeadingAccuracy; CLLocationAccuracy _oldHorizontalAccuracy; double _oldZoom; double _oldPitch; @@ -215,28 +215,43 @@ [self updateFrameWithSize:MGLUserLocationAnnotationDotSize]; } - BOOL showHeadingIndicator = YES;//self.mapView.userTrackingMode == MGLUserTrackingModeFollowWithHeading; - - // update heading indicator + // heading indicator (tinted, beam or arrow) // + BOOL headingTrackingModeEnabled = self.mapView.userTrackingMode == MGLUserTrackingModeFollowWithHeading; + BOOL showHeadingIndicator = self.mapView.showsUserHeadingIndicator || headingTrackingModeEnabled; + if (showHeadingIndicator) { _headingIndicatorLayer.hidden = NO; CLLocationDirection headingAccuracy = self.userLocation.heading.headingAccuracy; - // heading indicator (tinted, semi-circle) - // + if (([_headingIndicatorLayer isMemberOfClass:[MGLUserLocationHeadingBeamLayer class]] && ! headingTrackingModeEnabled) || + ([_headingIndicatorLayer isMemberOfClass:[MGLUserLocationHeadingArrowLayer class]] && headingTrackingModeEnabled)) + { + [_headingIndicatorLayer removeFromSuperlayer]; + _headingIndicatorLayer = nil; + _oldHeadingAccuracy = -1; + } + if ( ! _headingIndicatorLayer && headingAccuracy) { - _headingIndicatorLayer = [[MGLUserLocationHeadingBeamLayer alloc] initWithUserLocationAnnotationView:self]; - //_headingIndicatorLayer = [[MGLUserLocationHeadingArrowLayer alloc] initWithUserLocationAnnotationView:self]; - [self.layer insertSublayer:_headingIndicatorLayer below:_dotBorderLayer]; + if (headingTrackingModeEnabled) + { + _headingIndicatorLayer = [[MGLUserLocationHeadingBeamLayer alloc] initWithUserLocationAnnotationView:self]; + [self.layer insertSublayer:_headingIndicatorLayer below:_dotBorderLayer]; + } + else + { + _headingIndicatorLayer = [[MGLUserLocationHeadingArrowLayer alloc] initWithUserLocationAnnotationView:self]; + [self.layer addSublayer:_headingIndicatorLayer]; + _headingIndicatorLayer.zPosition = 1; + } } if (_oldHeadingAccuracy != headingAccuracy) { - //[_headingIndicatorLayer updateHeadingAccuracy:headingAccuracy]; - _oldHeadingAccuracy = headingAccuracy; + [_headingIndicatorLayer updateHeadingAccuracy:headingAccuracy]; + _oldHeadingAccuracy = headingAccuracy; } if (self.userLocation.heading.trueHeading >= 0) @@ -256,7 +271,6 @@ _headingIndicatorLayer = nil; } - // update accuracy ring (if zoom or horizontal accuracy have changed) // if (_accuracyRingLayer && (_oldZoom != self.mapView.zoomLevel || _oldHorizontalAccuracy != self.userLocation.location.horizontalAccuracy)) diff --git a/platform/ios/src/MGLUserLocationHeadingArrowLayer.h b/platform/ios/src/MGLUserLocationHeadingArrowLayer.h index 2b7dea4e62..6c01356944 100644 --- a/platform/ios/src/MGLUserLocationHeadingArrowLayer.h +++ b/platform/ios/src/MGLUserLocationHeadingArrowLayer.h @@ -1,9 +1,11 @@ #import <QuartzCore/QuartzCore.h> #import "MGLUserLocationAnnotationView.h" +#import "MGLUserLocationHeadingIndicator.h" -@interface MGLUserLocationHeadingArrowLayer : CAShapeLayer +@interface MGLUserLocationHeadingArrowLayer : CAShapeLayer <MGLUserLocationHeadingIndicator> - (instancetype)initWithUserLocationAnnotationView:(MGLUserLocationAnnotationView *)userLocationView; +- (void)updateHeadingAccuracy:(CLLocationDirection)accuracy; - (void)updateTintColor:(CGColorRef)color; @end diff --git a/platform/ios/src/MGLUserLocationHeadingArrowLayer.m b/platform/ios/src/MGLUserLocationHeadingArrowLayer.m index 3365fddb02..912ce30c35 100644 --- a/platform/ios/src/MGLUserLocationHeadingArrowLayer.m +++ b/platform/ios/src/MGLUserLocationHeadingArrowLayer.m @@ -27,9 +27,13 @@ const CGFloat MGLUserLocationHeadingArrowSize = 6; return self; } +- (void)updateHeadingAccuracy:(CLLocationDirection)accuracy +{ + // unimplemented +} + - (void)updateTintColor:(CGColorRef)color { - // redraw the raw tinted gradient self.fillColor = color; } diff --git a/platform/ios/src/MGLUserLocationHeadingBeamLayer.h b/platform/ios/src/MGLUserLocationHeadingBeamLayer.h index 9a5d4a8f14..93f8ea17ab 100644 --- a/platform/ios/src/MGLUserLocationHeadingBeamLayer.h +++ b/platform/ios/src/MGLUserLocationHeadingBeamLayer.h @@ -1,9 +1,10 @@ #import <QuartzCore/QuartzCore.h> #import "MGLUserLocationAnnotationView.h" +#import "MGLUserLocationHeadingIndicator.h" -@interface MGLUserLocationHeadingBeamLayer : CALayer +@interface MGLUserLocationHeadingBeamLayer : CALayer <MGLUserLocationHeadingIndicator> -- (instancetype)initWithUserLocationAnnotationView:(MGLUserLocationAnnotationView *)userLocationView; +- (MGLUserLocationHeadingBeamLayer *)initWithUserLocationAnnotationView:(MGLUserLocationAnnotationView *)userLocationView; - (void)updateHeadingAccuracy:(CLLocationDirection)accuracy; - (void)updateTintColor:(CGColorRef)color; diff --git a/platform/ios/src/MGLUserLocationHeadingIndicator.h b/platform/ios/src/MGLUserLocationHeadingIndicator.h new file mode 100644 index 0000000000..61476b96a2 --- /dev/null +++ b/platform/ios/src/MGLUserLocationHeadingIndicator.h @@ -0,0 +1,10 @@ +#import <QuartzCore/QuartzCore.h> +#import "MGLUserLocationAnnotationView.h" + +@protocol MGLUserLocationHeadingIndicator <NSObject> + +- (instancetype)initWithUserLocationAnnotationView:(MGLUserLocationAnnotationView *)userLocationView; +- (void)updateHeadingAccuracy:(CLLocationDirection)accuracy; +- (void)updateTintColor:(CGColorRef)color; + +@end |