From 5db97ed96ee1b6d5fa7b4ae6065cf5399ae1e2c0 Mon Sep 17 00:00:00 2001 From: Jason Wray Date: Thu, 10 Aug 2017 14:27:27 -0400 Subject: [ios] Introduce MGLUserLocationHeadingArrowLayer class --- platform/ios/ios.xcodeproj/project.pbxproj | 10 ++++ .../ios/src/MGLFaux3DUserLocationAnnotationView.m | 7 ++- .../ios/src/MGLUserLocationHeadingArrowLayer.h | 9 ++++ .../ios/src/MGLUserLocationHeadingArrowLayer.m | 55 ++++++++++++++++++++++ 4 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 platform/ios/src/MGLUserLocationHeadingArrowLayer.h create mode 100644 platform/ios/src/MGLUserLocationHeadingArrowLayer.m diff --git a/platform/ios/ios.xcodeproj/project.pbxproj b/platform/ios/ios.xcodeproj/project.pbxproj index 6408eb9087..9a610fc4e6 100644 --- a/platform/ios/ios.xcodeproj/project.pbxproj +++ b/platform/ios/ios.xcodeproj/project.pbxproj @@ -219,6 +219,9 @@ 966FCF4C1F3A5C9200F2B6DE /* MGLUserLocationHeadingBeamLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 966FCF4A1F3A5C9200F2B6DE /* MGLUserLocationHeadingBeamLayer.h */; }; 966FCF4E1F3A5C9200F2B6DE /* MGLUserLocationHeadingBeamLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 966FCF4B1F3A5C9200F2B6DE /* MGLUserLocationHeadingBeamLayer.m */; }; 966FCF4F1F3A5C9200F2B6DE /* MGLUserLocationHeadingBeamLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 966FCF4B1F3A5C9200F2B6DE /* MGLUserLocationHeadingBeamLayer.m */; }; + 966FCF531F3C322400F2B6DE /* MGLUserLocationHeadingArrowLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 966FCF501F3C321000F2B6DE /* MGLUserLocationHeadingArrowLayer.h */; }; + 966FCF541F3C323300F2B6DE /* MGLUserLocationHeadingArrowLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 966FCF511F3C321000F2B6DE /* MGLUserLocationHeadingArrowLayer.m */; }; + 966FCF551F3C323500F2B6DE /* MGLUserLocationHeadingArrowLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 966FCF511F3C321000F2B6DE /* MGLUserLocationHeadingArrowLayer.m */; }; 968F36B51E4D128D003A5522 /* MGLDistanceFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = 3557F7AE1E1D27D300CCA5E6 /* MGLDistanceFormatter.h */; settings = {ATTRIBUTES = (Public, ); }; }; 96E027231E57C76E004B8E66 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 96E027251E57C76E004B8E66 /* Localizable.strings */; }; DA00FC8E1D5EEB0D009AABC8 /* MGLAttributionInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = DA00FC8C1D5EEB0D009AABC8 /* MGLAttributionInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -691,6 +694,8 @@ 9660916F1E5BBFDE00A9A03B /* lt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lt; path = lt.lproj/Localizable.strings; sourceTree = ""; }; 966FCF4A1F3A5C9200F2B6DE /* MGLUserLocationHeadingBeamLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLUserLocationHeadingBeamLayer.h; sourceTree = ""; }; 966FCF4B1F3A5C9200F2B6DE /* MGLUserLocationHeadingBeamLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MGLUserLocationHeadingBeamLayer.m; sourceTree = ""; }; + 966FCF501F3C321000F2B6DE /* MGLUserLocationHeadingArrowLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLUserLocationHeadingArrowLayer.h; sourceTree = ""; }; + 966FCF511F3C321000F2B6DE /* MGLUserLocationHeadingArrowLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MGLUserLocationHeadingArrowLayer.m; sourceTree = ""; }; 968F36B41E4D0FC6003A5522 /* ja */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; }; 96E027241E57C76E004B8E66 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = ""; }; 96E027271E57C77A004B8E66 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; }; @@ -1613,6 +1618,8 @@ 359F57451D2FDBD5005217F1 /* MGLUserLocationAnnotationView_Private.h */, 354B83941D2E873E005D9406 /* MGLUserLocationAnnotationView.h */, 354B83951D2E873E005D9406 /* MGLUserLocationAnnotationView.m */, + 966FCF501F3C321000F2B6DE /* MGLUserLocationHeadingArrowLayer.h */, + 966FCF511F3C321000F2B6DE /* MGLUserLocationHeadingArrowLayer.m */, 966FCF4A1F3A5C9200F2B6DE /* MGLUserLocationHeadingBeamLayer.h */, 966FCF4B1F3A5C9200F2B6DE /* MGLUserLocationHeadingBeamLayer.m */, ); @@ -1671,6 +1678,7 @@ DA8847FB1CBAFA5100AB86E3 /* MGLShape.h in Headers */, 353933F51D3FB785003F57D7 /* MGLBackgroundStyleLayer.h in Headers */, DA88485A1CBAFB9800AB86E3 /* MGLUserLocation_Private.h in Headers */, + 966FCF531F3C322400F2B6DE /* MGLUserLocationHeadingArrowLayer.h in Headers */, DA27C24F1CBB4C11000B0ECD /* MGLAccountManager_Private.h in Headers */, DA8847FC1CBAFA5100AB86E3 /* MGLStyle.h in Headers */, DD9BE4F71EB263C50079A3AF /* UIViewController+MGLAdditions.h in Headers */, @@ -2235,6 +2243,7 @@ 3538AA1F1D542239008EC33D /* MGLForegroundStyleLayer.mm in Sources */, DA00FC901D5EEB0D009AABC8 /* MGLAttributionInfo.mm in Sources */, DA88482D1CBAFA6200AB86E3 /* NSBundle+MGLAdditions.m in Sources */, + 966FCF541F3C323300F2B6DE /* MGLUserLocationHeadingArrowLayer.m in Sources */, DA88485B1CBAFB9800AB86E3 /* MGLUserLocation.m in Sources */, 350098BD1D480108004B2AF0 /* MGLVectorSource.mm in Sources */, 3566C76E1D4A8DFA008152BC /* MGLRasterSource.mm in Sources */, @@ -2319,6 +2328,7 @@ 3538AA201D542239008EC33D /* MGLForegroundStyleLayer.mm in Sources */, DA00FC911D5EEB0D009AABC8 /* MGLAttributionInfo.mm in Sources */, DAA4E4201CBB730400178DFB /* MGLOfflinePack.mm in Sources */, + 966FCF551F3C323500F2B6DE /* MGLUserLocationHeadingArrowLayer.m in Sources */, DAA4E4331CBB730400178DFB /* MGLUserLocation.m in Sources */, 350098BE1D480108004B2AF0 /* MGLVectorSource.mm in Sources */, 3566C76F1D4A8DFA008152BC /* MGLRasterSource.mm in Sources */, diff --git a/platform/ios/src/MGLFaux3DUserLocationAnnotationView.m b/platform/ios/src/MGLFaux3DUserLocationAnnotationView.m index 36c5292127..a04ac8cd28 100644 --- a/platform/ios/src/MGLFaux3DUserLocationAnnotationView.m +++ b/platform/ios/src/MGLFaux3DUserLocationAnnotationView.m @@ -3,6 +3,7 @@ #import "MGLMapView.h" #import "MGLUserLocation.h" #import "MGLUserLocationHeadingBeamLayer.h" +#import "MGLUserLocationHeadingArrowLayer.h" @implementation MGLFaux3DUserLocationAnnotationView { @@ -12,6 +13,7 @@ CAShapeLayer *_puckArrow; MGLUserLocationHeadingBeamLayer *_headingIndicatorLayer; + //MGLUserLocationHeadingArrowLayer *_headingIndicatorLayer; CALayer *_accuracyRingLayer; CALayer *_dotBorderLayer; CALayer *_dotLayer; @@ -213,7 +215,7 @@ [self updateFrameWithSize:MGLUserLocationAnnotationDotSize]; } - BOOL showHeadingIndicator = self.mapView.userTrackingMode == MGLUserTrackingModeFollowWithHeading; + BOOL showHeadingIndicator = YES;//self.mapView.userTrackingMode == MGLUserTrackingModeFollowWithHeading; // update heading indicator // @@ -227,13 +229,14 @@ if ( ! _headingIndicatorLayer && headingAccuracy) { _headingIndicatorLayer = [[MGLUserLocationHeadingBeamLayer alloc] initWithUserLocationAnnotationView:self]; + //_headingIndicatorLayer = [[MGLUserLocationHeadingArrowLayer alloc] initWithUserLocationAnnotationView:self]; [self.layer insertSublayer:_headingIndicatorLayer below:_dotBorderLayer]; _oldHeadingAccuracy = headingAccuracy; } else if (_oldHeadingAccuracy != headingAccuracy) { - [_headingIndicatorLayer updateHeadingAccuracy:headingAccuracy]; + //[_headingIndicatorLayer updateHeadingAccuracy:headingAccuracy]; _oldHeadingAccuracy = headingAccuracy; } diff --git a/platform/ios/src/MGLUserLocationHeadingArrowLayer.h b/platform/ios/src/MGLUserLocationHeadingArrowLayer.h new file mode 100644 index 0000000000..2b7dea4e62 --- /dev/null +++ b/platform/ios/src/MGLUserLocationHeadingArrowLayer.h @@ -0,0 +1,9 @@ +#import +#import "MGLUserLocationAnnotationView.h" + +@interface MGLUserLocationHeadingArrowLayer : CAShapeLayer + +- (instancetype)initWithUserLocationAnnotationView:(MGLUserLocationAnnotationView *)userLocationView; +- (void)updateTintColor:(CGColorRef)color; + +@end diff --git a/platform/ios/src/MGLUserLocationHeadingArrowLayer.m b/platform/ios/src/MGLUserLocationHeadingArrowLayer.m new file mode 100644 index 0000000000..3365fddb02 --- /dev/null +++ b/platform/ios/src/MGLUserLocationHeadingArrowLayer.m @@ -0,0 +1,55 @@ +#import "MGLUserLocationHeadingArrowLayer.h" + +#import "MGLFaux3DUserLocationAnnotationView.h" +#import "MGLGeometry.h" + +const CGFloat MGLUserLocationHeadingArrowSize = 6; + +@implementation MGLUserLocationHeadingArrowLayer + +- (instancetype)initWithUserLocationAnnotationView:(MGLUserLocationAnnotationView *)userLocationView +{ + CGFloat size = userLocationView.bounds.size.width + MGLUserLocationHeadingArrowSize; + + self = [super init]; + self.bounds = CGRectMake(0, 0, size, size); + self.position = CGPointMake(CGRectGetMidX(userLocationView.bounds), CGRectGetMidY(userLocationView.bounds)); + self.path = [self arrowPath]; + self.fillColor = userLocationView.tintColor.CGColor; + self.shouldRasterize = YES; + self.rasterizationScale = UIScreen.mainScreen.scale; + self.drawsAsynchronously = YES; + + self.strokeColor = UIColor.whiteColor.CGColor; + self.lineWidth = 1.0; + self.lineJoin = kCALineJoinRound; + + return self; +} + +- (void)updateTintColor:(CGColorRef)color +{ + // redraw the raw tinted gradient + self.fillColor = color; +} + +- (CGPathRef)arrowPath { + CGFloat center = roundf(CGRectGetMidX(self.bounds)); + CGFloat size = MGLUserLocationHeadingArrowSize; + + CGPoint top = CGPointMake(center, 0); + CGPoint left = CGPointMake(center - size, size); + CGPoint right = CGPointMake(center + size, size); + CGPoint middle = CGPointMake(center, size / M_PI); + + UIBezierPath *bezierPath = [UIBezierPath bezierPath]; + [bezierPath moveToPoint:top]; + [bezierPath addLineToPoint:left]; + [bezierPath addQuadCurveToPoint:right controlPoint:middle]; + [bezierPath addLineToPoint:top]; + [bezierPath closePath]; + + return bezierPath.CGPath; +} + +@end -- cgit v1.2.1