summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJesse Bounds <jesse@rebounds.net>2016-10-26 17:13:38 -0700
committerGitHub <noreply@github.com>2016-10-26 17:13:38 -0700
commitd5af9b680b6b72eea7cd149a4552bd20bb676353 (patch)
tree84dc9c367ab616edd1219fe237034a5b2f524095
parent67ffc9685e573b10e4761b0bdb9962c79139f5da (diff)
downloadqtlocation-mapboxgl-d5af9b680b6b72eea7cd149a4552bd20bb676353.tar.gz
[ios, macos] Introduce visible annotations API (#6061)
Add visibleAnnotations API to make it easier for clients of MGLMapView to query for all visible annotations in the map or all visible annotations in a subsection of the map.
-rw-r--r--platform/ios/app/MBXViewController.m19
-rw-r--r--platform/ios/src/MGLMapView.h21
-rw-r--r--platform/ios/src/MGLMapView.mm29
-rw-r--r--platform/macos/src/MGLMapView.h21
-rw-r--r--platform/macos/src/MGLMapView.mm29
5 files changed, 119 insertions, 0 deletions
diff --git a/platform/ios/app/MBXViewController.m b/platform/ios/app/MBXViewController.m
index 790ff307bc..74f8b5f28a 100644
--- a/platform/ios/app/MBXViewController.m
+++ b/platform/ios/app/MBXViewController.m
@@ -46,6 +46,7 @@ typedef NS_ENUM(NSInteger, MBXSettingsAnnotationsRows) {
MBXSettingsAnnotations10000Sprites,
MBXSettingsAnnotationsTestShapes,
MBXSettingsAnnotationsCustomCallout,
+ MBXSettingsAnnotationsQueryAnnotations,
MBXSettingsAnnotationsRemoveAnnotations,
};
@@ -296,6 +297,7 @@ typedef NS_ENUM(NSInteger, MBXSettingsMiscellaneousRows) {
@"Add 10,000 Sprites",
@"Add Test Shapes",
@"Add Point With Custom Callout",
+ @"Query Annotations",
@"Remove Annotations",
]];
break;
@@ -401,6 +403,9 @@ typedef NS_ENUM(NSInteger, MBXSettingsMiscellaneousRows) {
case MBXSettingsAnnotationsCustomCallout:
[self addAnnotationWithCustomCallout];
break;
+ case MBXSettingsAnnotationsQueryAnnotations:
+ [self testQueryPointAnnotations];
+ break;
case MBXSettingsAnnotationsRemoveAnnotations:
[self.mapView removeAnnotations:self.mapView.annotations];
break;
@@ -1091,6 +1096,20 @@ typedef NS_ENUM(NSInteger, MBXSettingsMiscellaneousRows) {
self.mapView.userTrackingMode = MGLUserTrackingModeFollow;
}
+- (void)testQueryPointAnnotations {
+ NSNumber *visibleAnnotationCount = @(self.mapView.visibleAnnotations.count);
+ NSString *message;
+ if ([visibleAnnotationCount integerValue] == 1) {
+ message = [NSString stringWithFormat:@"There is %@ visible annotation.", visibleAnnotationCount];
+ } else {
+ message = [NSString stringWithFormat:@"There are %@ visible annotations.", visibleAnnotationCount];
+ }
+
+ UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Visible Annotations" message:message preferredStyle:UIAlertControllerStyleAlert];
+ [alertController addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleCancel handler:nil]];
+ [self presentViewController:alertController animated:YES completion:nil];
+}
+
- (void)printTelemetryLogFile
{
NSString *fileContents = [NSString stringWithContentsOfFile:[self telemetryDebugLogFilePath] encoding:NSUTF8StringEncoding error:nil];
diff --git a/platform/ios/src/MGLMapView.h b/platform/ios/src/MGLMapView.h
index 5a89632db8..e467495a4a 100644
--- a/platform/ios/src/MGLMapView.h
+++ b/platform/ios/src/MGLMapView.h
@@ -893,6 +893,16 @@ IB_DESIGNABLE
@property (nonatomic, readonly, nullable) NS_ARRAY_OF(id <MGLAnnotation>) *annotations;
/**
+ The complete list of annotations associated with the receiver that are
+ currently visible.
+
+ The objects in this array must adopt the `MGLAnnotation` protocol. If no
+ annotations are associated with the map view or if no annotations associated
+ with the map view are currently visible, the value of this property is `nil`.
+ */
+@property (nonatomic, readonly, nullable) NS_ARRAY_OF(id <MGLAnnotation>) *visibleAnnotations;
+
+/**
Adds an annotation to the map view.
@note `MGLMultiPolyline`, `MGLMultiPolygon`, `MGLShapeCollection`, and
@@ -986,6 +996,17 @@ IB_DESIGNABLE
*/
- (nullable __kindof MGLAnnotationView *)dequeueReusableAnnotationViewWithIdentifier:(NSString *)identifier;
+/**
+ Returns the list of annotations associated with the receiver that intersect with
+ the given rectangle.
+
+ @param rect A rectangle expressed in the map view’s coordinate system.
+ @return An array of objects that adopt the `MGLAnnotation` protocol or `nil` if
+ no annotations associated with the map view are currently visible in the
+ rectangle.
+ */
+- (nullable NS_ARRAY_OF(id <MGLAnnotation>) *)visibleAnnotationsInRect:(CGRect)rect;
+
#pragma mark Managing Annotation Selections
/**
diff --git a/platform/ios/src/MGLMapView.mm b/platform/ios/src/MGLMapView.mm
index c6c0920f56..24a69e1d5a 100644
--- a/platform/ios/src/MGLMapView.mm
+++ b/platform/ios/src/MGLMapView.mm
@@ -2811,6 +2811,35 @@ public:
return [NSArray arrayWithObjects:&annotations[0] count:annotations.size()];
}
+- (nullable NS_ARRAY_OF(id <MGLAnnotation>) *)visibleAnnotations
+{
+ return [self visibleAnnotationsInRect:self.bounds];
+}
+
+- (nullable NS_ARRAY_OF(id <MGLAnnotation>) *)visibleAnnotationsInRect:(CGRect)rect
+{
+ if (_annotationContextsByAnnotationTag.empty())
+ {
+ return nil;
+ }
+
+ std::vector<MGLAnnotationTag> annotationTags = [self annotationTagsInRect:rect];
+ if (annotationTags.size())
+ {
+ NSMutableArray *annotations = [NSMutableArray arrayWithCapacity:annotationTags.size()];
+
+ for (auto const& annotationTag: annotationTags)
+ {
+ MGLAnnotationContext annotationContext = _annotationContextsByAnnotationTag[annotationTag];
+ [annotations addObject:annotationContext.annotation];
+ }
+
+ return [annotations copy];
+ }
+
+ return nil;
+}
+
/// Returns the annotation assigned the given tag. Cheap.
- (id <MGLAnnotation>)annotationWithTag:(MGLAnnotationTag)tag
{
diff --git a/platform/macos/src/MGLMapView.h b/platform/macos/src/MGLMapView.h
index 3499671ff1..3dbbbe3d82 100644
--- a/platform/macos/src/MGLMapView.h
+++ b/platform/macos/src/MGLMapView.h
@@ -569,6 +569,16 @@ IB_DESIGNABLE
- (void)addAnnotations:(NS_ARRAY_OF(id <MGLAnnotation>) *)annotations;
/**
+ The complete list of annotations associated with the receiver that are
+ currently visible.
+
+ The objects in this array must adopt the `MGLAnnotation` protocol. If no
+ annotations are associated with the map view or if no annotations associated
+ with the map view are currently visible, the value of this property is `nil`.
+ */
+@property (nonatomic, readonly, nullable) NS_ARRAY_OF(id <MGLAnnotation>) *visibleAnnotations;
+
+/**
Removes an annotation from the map view, deselecting it if it is selected.
Removing an annotation object dissociates it from the map view entirely,
@@ -608,6 +618,17 @@ IB_DESIGNABLE
*/
- (nullable MGLAnnotationImage *)dequeueReusableAnnotationImageWithIdentifier:(NSString *)identifier;
+/**
+ Returns the list of annotations associated with the receiver that intersect with
+ the given rectangle.
+
+ @param rect A rectangle expressed in the map view’s coordinate system.
+ @return An array of objects that adopt the `MGLAnnotation` protocol or `nil` if
+ no annotations associated with the map view are currently visible in the
+ rectangle.
+ */
+- (nullable NS_ARRAY_OF(id <MGLAnnotation>) *)visibleAnnotationsInRect:(CGRect)rect;
+
#pragma mark Managing Annotation Selections
/**
diff --git a/platform/macos/src/MGLMapView.mm b/platform/macos/src/MGLMapView.mm
index 14b83762a3..4d1f00359d 100644
--- a/platform/macos/src/MGLMapView.mm
+++ b/platform/macos/src/MGLMapView.mm
@@ -1616,6 +1616,35 @@ public:
return [NSArray arrayWithObjects:&annotations[0] count:annotations.size()];
}
+- (nullable NS_ARRAY_OF(id <MGLAnnotation>) *)visibleAnnotations
+{
+ return [self visibleFeaturesInRect:self.bounds];
+}
+
+- (nullable NS_ARRAY_OF(id <MGLAnnotation>) *)visibleAnnotationsInRect:(CGRect)rect
+{
+ if (_annotationContextsByAnnotationTag.empty())
+ {
+ return nil;
+ }
+
+ std::vector<MGLAnnotationTag> annotationTags = [self annotationTagsInRect:rect];
+ if (annotationTags.size())
+ {
+ NSMutableArray *annotations = [NSMutableArray arrayWithCapacity:annotationTags.size()];
+
+ for (auto const& annotationTag: annotationTags)
+ {
+ MGLAnnotationContext annotationContext = _annotationContextsByAnnotationTag[annotationTag];
+ [annotations addObject:annotationContext.annotation];
+ }
+
+ return [annotations copy];
+ }
+
+ return nil;
+}
+
/// Returns the annotation assigned the given tag. Cheap.
- (id <MGLAnnotation>)annotationWithTag:(MGLAnnotationTag)tag {
if (!_annotationContextsByAnnotationTag.count(tag)) {