summaryrefslogtreecommitdiff
path: root/platform/ios
diff options
context:
space:
mode:
authorMinh Nguyễn <mxn@1ec5.org>2016-08-19 13:56:46 -0700
committerMinh Nguyễn <mxn@1ec5.org>2016-11-28 15:45:43 -0800
commit9fac640bf35db408f56103b45f8ef7982204bfa9 (patch)
tree95fe49ae283c682db98d3b63a8ebbebf03769450 /platform/ios
parent850b70ff91e582916829c5248afcafa195070a43 (diff)
downloadqtlocation-mapboxgl-9fac640bf35db408f56103b45f8ef7982204bfa9.tar.gz
[ios, macos] Key-value compliance for MGLStyle
Replaced -[MGLMapView style] with a property. Keep the MGLStyle object around for the lifetime of the style. Bracket changes to layers in willChange and didChange calls. The built-in point annotation layer is added after the style is finished loading but before the map is finished loading. Cause a second wave of change notifications to go out, about both sources and layers. Issue change notifications for style layers when shape annotations are added or removed.
Diffstat (limited to 'platform/ios')
-rw-r--r--platform/ios/src/MGLMapView.h15
-rw-r--r--platform/ios/src/MGLMapView.mm41
2 files changed, 44 insertions, 12 deletions
diff --git a/platform/ios/src/MGLMapView.h b/platform/ios/src/MGLMapView.h
index e467495a4a..e066387e25 100644
--- a/platform/ios/src/MGLMapView.h
+++ b/platform/ios/src/MGLMapView.h
@@ -118,6 +118,14 @@ IB_DESIGNABLE
#pragma mark Configuring the Map’s Appearance
/**
+ The style currently displayed in the receiver.
+
+ Unlike the `styleURL` property, this property is set to an object that allows
+ you to manipulate every aspect of the style locally.
+ */
+@property (nonatomic, readonly) MGLStyle *style;
+
+/**
URLs of the styles bundled with the library.
@deprecated Call the relevant class method of `MGLStyle` for the URL of a
@@ -134,6 +142,9 @@ IB_DESIGNABLE
If you set this property to `nil`, the receiver will use the default style
and this property will automatically be set to that style’s URL.
+
+ If you want to modify the current style without replacing it outright, or if
+ you want to introspect individual style attributes, use the `style` property.
*/
@property (nonatomic, null_resettable) NSURL *styleURL;
@@ -1077,10 +1088,6 @@ IB_DESIGNABLE
*/
- (void)removeOverlays:(NS_ARRAY_OF(id <MGLOverlay>) *)overlays;
-#pragma mark - Runtime styling API
-
-- (MGLStyle *)style;
-
#pragma mark Accessing the Underlying Map Data
/**
diff --git a/platform/ios/src/MGLMapView.mm b/platform/ios/src/MGLMapView.mm
index e857a9fa4d..b1ecf1c415 100644
--- a/platform/ios/src/MGLMapView.mm
+++ b/platform/ios/src/MGLMapView.mm
@@ -236,6 +236,9 @@ public:
@property (nonatomic, readwrite) UIButton *attributionButton;
@property (nonatomic) NS_MUTABLE_ARRAY_OF(NSLayoutConstraint *) *attributionButtonConstraints;
@property (nonatomic) UIActionSheet *attributionSheet;
+
+@property (nonatomic, readwrite) MGLStyle *style;
+
@property (nonatomic) UIPanGestureRecognizer *pan;
@property (nonatomic) UIPinchGestureRecognizer *pinch;
@property (nonatomic) UIRotationGestureRecognizer *rotate;
@@ -284,6 +287,8 @@ public:
std::vector<MGLAnnotationTag> _annotationsNearbyLastTap;
CGPoint _initialImplicitCalloutViewOffset;
NSDate *_userLocationAnimationCompletionDate;
+ /// True if a willChange notification has been issued for shape annotation layers and a didChange notification is pending.
+ BOOL _isChangingAnnotationLayers;
BOOL _isWaitingForRedundantReachableNotification;
BOOL _isTargetingInterfaceBuilder;
@@ -355,14 +360,17 @@ public:
- (void)setStyleURL:(nullable NSURL *)styleURL
{
if (_isTargetingInterfaceBuilder) return;
-
+
if ( ! styleURL)
{
styleURL = [MGLStyle streetsStyleURLWithVersion:MGLStyleDefaultVersion];
}
styleURL = styleURL.mgl_URLByStandardizingScheme;
+ [self willChangeValueForKey:@"style"];
+ _style = [[MGLStyle alloc] initWithMapView:self];
_mbglMap->setStyleURL([[styleURL absoluteString] UTF8String]);
+ [self didChangeValueForKey:@"style"];
}
- (IBAction)reloadStyle:(__unused id)sender {
@@ -620,13 +628,6 @@ public:
return image;
}
-- (MGLStyle *)style
-{
- MGLStyle *style = [[MGLStyle alloc] init];
- style.mapView = self;
- return style;
-}
-
- (void)reachabilityChanged:(NSNotification *)notification
{
MGLReachability *reachability = [notification object];
@@ -2895,6 +2896,7 @@ public:
continue;
}
+ _isChangingAnnotationLayers = YES;
MGLAnnotationTag annotationTag = _mbglMap->addAnnotation([multiPoint annotationObjectWithDelegate:self]);
MGLAnnotationContext context;
context.annotation = annotation;
@@ -2991,6 +2993,10 @@ public:
[self updateAnnotationContainerViewWithAnnotationViews:newAnnotationViews];
[self didChangeValueForKey:@"annotations"];
+ if (_isChangingAnnotationLayers)
+ {
+ [self.style willChangeValueForKey:@"layers"];
+ }
if ([self.delegate respondsToSelector:@selector(mapView:didAddAnnotationViews:)])
{
@@ -3213,11 +3219,16 @@ public:
[(NSObject *)annotation removeObserver:self forKeyPath:@"coordinates" context:(void *)(NSUInteger)annotationTag];
}
+ _isChangingAnnotationLayers = YES;
_mbglMap->removeAnnotation(annotationTag);
}
[self didChangeValueForKey:@"annotations"];
UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, nil);
+ if (_isChangingAnnotationLayers)
+ {
+ [self.style willChangeValueForKey:@"layers"];
+ }
}
- (void)addOverlay:(id <MGLOverlay>)overlay
@@ -4559,6 +4570,10 @@ public:
}
case mbgl::MapChangeDidFinishLoadingMap:
{
+ [self.style willChangeValueForKey:@"sources"];
+ [self.style didChangeValueForKey:@"sources"];
+ [self.style willChangeValueForKey:@"layers"];
+ [self.style didChangeValueForKey:@"layers"];
if ([self.delegate respondsToSelector:@selector(mapViewDidFinishLoadingMap:)])
{
[self.delegate mapViewDidFinishLoadingMap:self];
@@ -4602,6 +4617,11 @@ public:
case mbgl::MapChangeDidFinishRenderingFrame:
case mbgl::MapChangeDidFinishRenderingFrameFullyRendered:
{
+ if (_isChangingAnnotationLayers)
+ {
+ _isChangingAnnotationLayers = NO;
+ [self.style didChangeValueForKey:@"layers"];
+ }
[self updateAnnotationViews];
if ([self.delegate respondsToSelector:@selector(mapViewDidFinishRenderingFrame:fullyRendered:)])
{
@@ -4611,6 +4631,11 @@ public:
}
case mbgl::MapChangeDidFinishLoadingStyle:
{
+ [self.style willChangeValueForKey:@"name"];
+ [self.style willChangeValueForKey:@"sources"];
+ [self.style didChangeValueForKey:@"sources"];
+ [self.style willChangeValueForKey:@"layers"];
+ [self.style didChangeValueForKey:@"layers"];
if ([self.delegate respondsToSelector:@selector(mapView:didFinishLoadingStyle:)])
{
[self.delegate mapView:self didFinishLoadingStyle:self.style];