summaryrefslogtreecommitdiff
path: root/platform/ios
diff options
context:
space:
mode:
authorJason Wray <jason@mapbox.com>2016-08-06 17:59:35 -0700
committerJason Wray <jason@mapbox.com>2016-08-06 17:59:35 -0700
commitae88c01c9455654038341eee5baaaece71796b35 (patch)
treebec1320625421c7c839faf230975e8b629d135c3 /platform/ios
parentb928ac5bd407efb8e4fad1e47d843eb203014841 (diff)
downloadqtlocation-mapboxgl-ae88c01c9455654038341eee5baaaece71796b35.tar.gz
[ios] Hit test the user location annotation dot specifically
Rather than try to exclude layers in the touch hit test, this specifically only checks against the main layer for the user dot or puck. Back-port of e4a9173a2a5c585dda3fa7a0f955cff1552f8d25.
Diffstat (limited to 'platform/ios')
-rw-r--r--platform/ios/src/MGLMapView.mm18
-rw-r--r--platform/ios/src/MGLUserLocationAnnotationView.h1
-rw-r--r--platform/ios/src/MGLUserLocationAnnotationView.m6
3 files changed, 18 insertions, 7 deletions
diff --git a/platform/ios/src/MGLMapView.mm b/platform/ios/src/MGLMapView.mm
index 4ec3619189..f204940469 100644
--- a/platform/ios/src/MGLMapView.mm
+++ b/platform/ios/src/MGLMapView.mm
@@ -1392,17 +1392,21 @@ mbgl::Duration MGLDurationInSeconds(NSTimeInterval duration)
return;
}
- CGPoint tapPoint = [singleTap locationInView:self];
-
- CALayer *hitLayer = self.userLocationVisible ? [self.userLocationAnnotationView.layer.presentationLayer hitTest:tapPoint] : nil;
- if (hitLayer && hitLayer != self.userLocationAnnotationView.haloLayer.presentationLayer)
+ if (self.userLocationVisible)
{
- if ( ! _userLocationAnnotationIsSelected)
+ CGPoint tapPointForUserLocation = [singleTap locationInView:self.userLocationAnnotationView];
+ CALayer *hitLayer = [self.userLocationAnnotationView.hitTestLayer hitTest:tapPointForUserLocation];
+ if (hitLayer)
{
- [self selectAnnotation:self.userLocation animated:YES];
+ if ( ! _userLocationAnnotationIsSelected)
+ {
+ [self selectAnnotation:self.userLocation animated:YES];
+ }
+ return;
}
- return;
}
+
+ CGPoint tapPoint = [singleTap locationInView:self];
MGLAnnotationTag hitAnnotationTag = [self annotationTagAtPoint:tapPoint persistingResults:YES];
if (hitAnnotationTag != MGLAnnotationTagNotFound)
diff --git a/platform/ios/src/MGLUserLocationAnnotationView.h b/platform/ios/src/MGLUserLocationAnnotationView.h
index 1eb50b7740..8ab9ea6e79 100644
--- a/platform/ios/src/MGLUserLocationAnnotationView.h
+++ b/platform/ios/src/MGLUserLocationAnnotationView.h
@@ -14,6 +14,7 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, weak) MGLMapView *mapView;
@property (nonatomic) MGLUserLocation *annotation;
@property (nonatomic, readonly, nullable) CALayer *haloLayer;
+@property (nonatomic, readonly) CALayer *hitTestLayer;
- (instancetype)initInMapView:(MGLMapView *)mapView NS_DESIGNATED_INITIALIZER;
- (void)setupLayers;
diff --git a/platform/ios/src/MGLUserLocationAnnotationView.m b/platform/ios/src/MGLUserLocationAnnotationView.m
index c514026e42..3ab2c5a796 100644
--- a/platform/ios/src/MGLUserLocationAnnotationView.m
+++ b/platform/ios/src/MGLUserLocationAnnotationView.m
@@ -147,6 +147,12 @@ const CGFloat MGLUserLocationAnnotationArrowSize = MGLUserLocationAnnotationPuck
}
}
+- (CALayer *)hitTestLayer
+{
+ // only the main dot should be interactive (i.e., exclude the accuracy ring and halo)
+ return _dotBorderLayer ?: _puckDot;
+}
+
- (void)setupLayers
{
if (CLLocationCoordinate2DIsValid(self.annotation.coordinate))