@@ -212,56 +212,64 @@ - (void)drawDot
212
212
_puckDot = nil ;
213
213
_puckArrow = nil ;
214
214
}
215
-
215
+
216
+ BOOL showHeadingIndicator = _mapView.userTrackingMode == MGLUserTrackingModeFollowWithHeading;
217
+
216
218
// update heading indicator
217
219
//
218
- if (_headingIndicatorLayer )
220
+ if (showHeadingIndicator )
219
221
{
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 )
224
259
{
225
260
// recalculate the clipping mask based on updated accuracy
226
261
_headingIndicatorMaskLayer.path = [[self headingIndicatorClippingMask ] CGPath ];
227
-
262
+
228
263
_oldHeadingAccuracy = self.annotation .heading .headingAccuracy ;
229
264
}
265
+
230
266
}
231
-
232
- // heading indicator (tinted, semi-circle)
233
- //
234
- if ( ! _headingIndicatorLayer && self.annotation .heading .headingAccuracy )
267
+ else
235
268
{
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 ;
250
271
}
251
272
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
- }
265
273
266
274
// update accuracy ring (if zoom or horizontal accuracy have changed)
267
275
//
0 commit comments