Skip to content
This repository was archived by the owner on Aug 8, 2023. It is now read-only.

Commit f8c75c6

Browse files
muZZkatfriedbunny
authored andcommitted
[ios] fix user annotation view refresh when switched from course to none
1 parent 58c90ac commit f8c75c6

File tree

2 files changed

+50
-38
lines changed

2 files changed

+50
-38
lines changed

platform/ios/MGLMapView.mm

+4
Original file line numberDiff line numberDiff line change
@@ -2628,6 +2628,10 @@ - (void)setUserTrackingMode:(MGLUserTrackingMode)mode animated:(BOOL)animated
26282628
{
26292629
[self.locationManager stopUpdatingHeading];
26302630

2631+
// Immediately update the annotation view; other cases update inside
2632+
// the locationManager:didUpdateLocations: method.
2633+
[self updateUserLocationAnnotationView];
2634+
26312635
break;
26322636
}
26332637
case MGLUserTrackingModeFollow:

platform/ios/MGLUserLocationAnnotationView.m

+46-38
Original file line numberDiff line numberDiff line change
@@ -212,56 +212,64 @@ - (void)drawDot
212212
_puckDot = nil;
213213
_puckArrow = nil;
214214
}
215-
215+
216+
BOOL showHeadingIndicator = _mapView.userTrackingMode == MGLUserTrackingModeFollowWithHeading;
217+
216218
// update heading indicator
217219
//
218-
if (_headingIndicatorLayer)
220+
if (showHeadingIndicator)
219221
{
220-
_headingIndicatorLayer.hidden = !(_mapView.userTrackingMode == MGLUserTrackingModeFollowWithHeading ||
221-
_mapView.userTrackingMode == MGLUserTrackingModeFollowWithCourse);
222-
223-
if (_oldHeadingAccuracy != self.annotation.heading.headingAccuracy)
222+
_headingIndicatorLayer.hidden = NO;
223+
224+
// heading indicator (tinted, semi-circle)
225+
//
226+
if ( ! _headingIndicatorLayer && self.annotation.heading.headingAccuracy)
227+
{
228+
CGFloat headingIndicatorSize = MGLUserLocationAnnotationHaloSize;
229+
230+
_headingIndicatorLayer = [CALayer layer];
231+
_headingIndicatorLayer.bounds = CGRectMake(0, 0, headingIndicatorSize, headingIndicatorSize);
232+
_headingIndicatorLayer.position = CGPointMake(super.bounds.size.width / 2.0, super.bounds.size.height / 2.0);
233+
_headingIndicatorLayer.contents = (__bridge id)[[self headingIndicatorTintedGradientImage] CGImage];
234+
_headingIndicatorLayer.contentsGravity = kCAGravityBottom;
235+
_headingIndicatorLayer.contentsScale = [UIScreen mainScreen].scale;
236+
_headingIndicatorLayer.opacity = 0.4;
237+
_headingIndicatorLayer.shouldRasterize = YES;
238+
_headingIndicatorLayer.rasterizationScale = [UIScreen mainScreen].scale;
239+
_headingIndicatorLayer.drawsAsynchronously = YES;
240+
241+
[self.layer insertSublayer:_headingIndicatorLayer below:_dotBorderLayer];
242+
}
243+
244+
// heading indicator accuracy mask (fan-shaped)
245+
//
246+
if ( ! _headingIndicatorMaskLayer && self.annotation.heading.headingAccuracy)
247+
{
248+
_headingIndicatorMaskLayer = [CAShapeLayer layer];
249+
_headingIndicatorMaskLayer.frame = _headingIndicatorLayer.bounds;
250+
_headingIndicatorMaskLayer.path = [[self headingIndicatorClippingMask] CGPath];
251+
252+
// apply the mask to the halo-radius-sized gradient layer
253+
_headingIndicatorLayer.mask = _headingIndicatorMaskLayer;
254+
255+
_oldHeadingAccuracy = self.annotation.heading.headingAccuracy;
256+
257+
}
258+
else if (_oldHeadingAccuracy != self.annotation.heading.headingAccuracy)
224259
{
225260
// recalculate the clipping mask based on updated accuracy
226261
_headingIndicatorMaskLayer.path = [[self headingIndicatorClippingMask] CGPath];
227-
262+
228263
_oldHeadingAccuracy = self.annotation.heading.headingAccuracy;
229264
}
265+
230266
}
231-
232-
// heading indicator (tinted, semi-circle)
233-
//
234-
if ( ! _headingIndicatorLayer && self.annotation.heading.headingAccuracy)
267+
else
235268
{
236-
CGFloat headingIndicatorSize = MGLUserLocationAnnotationHaloSize;
237-
238-
_headingIndicatorLayer = [CALayer layer];
239-
_headingIndicatorLayer.bounds = CGRectMake(0, 0, headingIndicatorSize, headingIndicatorSize);
240-
_headingIndicatorLayer.position = CGPointMake(super.bounds.size.width / 2.0, super.bounds.size.height / 2.0);
241-
_headingIndicatorLayer.contents = (__bridge id)[[self headingIndicatorTintedGradientImage] CGImage];
242-
_headingIndicatorLayer.contentsGravity = kCAGravityBottom;
243-
_headingIndicatorLayer.contentsScale = [UIScreen mainScreen].scale;
244-
_headingIndicatorLayer.opacity = 0.4;
245-
_headingIndicatorLayer.shouldRasterize = YES;
246-
_headingIndicatorLayer.rasterizationScale = [UIScreen mainScreen].scale;
247-
_headingIndicatorLayer.drawsAsynchronously = YES;
248-
249-
[self.layer insertSublayer:_headingIndicatorLayer below:_dotBorderLayer];
269+
_headingIndicatorLayer = nil;
270+
_headingIndicatorMaskLayer = nil;
250271
}
251272

252-
// heading indicator accuracy mask (fan-shaped)
253-
//
254-
if ( ! _headingIndicatorMaskLayer && self.annotation.heading.headingAccuracy)
255-
{
256-
_headingIndicatorMaskLayer = [CAShapeLayer layer];
257-
_headingIndicatorMaskLayer.frame = _headingIndicatorLayer.bounds;
258-
_headingIndicatorMaskLayer.path = [[self headingIndicatorClippingMask] CGPath];
259-
260-
// apply the mask to the halo-radius-sized gradient layer
261-
_headingIndicatorLayer.mask = _headingIndicatorMaskLayer;
262-
263-
_oldHeadingAccuracy = self.annotation.heading.headingAccuracy;
264-
}
265273

266274
// update accuracy ring (if zoom or horizontal accuracy have changed)
267275
//

0 commit comments

Comments
 (0)