diff options
author | Minh Nguyễn <mxn@1ec5.org> | 2016-08-19 13:56:46 -0700 |
---|---|---|
committer | Minh Nguyễn <mxn@1ec5.org> | 2016-11-28 15:45:43 -0800 |
commit | 9fac640bf35db408f56103b45f8ef7982204bfa9 (patch) | |
tree | 95fe49ae283c682db98d3b63a8ebbebf03769450 /platform/ios | |
parent | 850b70ff91e582916829c5248afcafa195070a43 (diff) | |
download | qtlocation-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.h | 15 | ||||
-rw-r--r-- | platform/ios/src/MGLMapView.mm | 41 |
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]; |