diff options
author | Julian Rex <julian.rex@gmail.com> | 2019-01-09 13:07:00 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-01-09 13:07:00 -0500 |
commit | 53e20430c8522d2450e463a1cd3a4d65c3119ea7 (patch) | |
tree | 66d23edd06bf8574bec175c6ea939140564ca4ca | |
parent | b6894557a748b53a9f5c887872187099a7c6f2d1 (diff) | |
download | qtlocation-mapboxgl-53e20430c8522d2450e463a1cd3a4d65c3119ea7.tar.gz |
[ios, macos] Fixes a bug where the animated parameter of -[MGLMapView selectAnnotation:animated:] was ignored. (#13689)
-rw-r--r-- | platform/ios/CHANGELOG.md | 1 | ||||
-rw-r--r-- | platform/ios/src/MGLMapView.h | 23 | ||||
-rw-r--r-- | platform/ios/src/MGLMapView.mm | 35 | ||||
-rw-r--r-- | platform/macos/src/MGLMapView.mm | 28 |
4 files changed, 53 insertions, 34 deletions
diff --git a/platform/ios/CHANGELOG.md b/platform/ios/CHANGELOG.md index aae0cc66c3..d96bc3cb07 100644 --- a/platform/ios/CHANGELOG.md +++ b/platform/ios/CHANGELOG.md @@ -6,6 +6,7 @@ Mapbox welcomes participation and contributions from everyone. Please read [CONT * Added an `MGLStyle.performsPlacementTransitions` property to control how long it takes for colliding labels to fade out. ([#13565](https://github.com/mapbox/mapbox-gl-native/pull/13565)) * Fixed a crash when casting large numbers in `NSExpression`. ([#13580](https://github.com/mapbox/mapbox-gl-native/pull/13580)) +* Fixed a bug where the `animated` parameter to `-[MGLMapView selectAnnotation:animated:]` was being ignored. ([#13689](https://github.com/mapbox/mapbox-gl-native/pull/13689)) ## 4.7.0 - December 18, 2018 diff --git a/platform/ios/src/MGLMapView.h b/platform/ios/src/MGLMapView.h index fd433fe1b3..65d712e62d 100644 --- a/platform/ios/src/MGLMapView.h +++ b/platform/ios/src/MGLMapView.h @@ -1415,14 +1415,16 @@ MGL_EXPORT IB_DESIGNABLE /** Selects an annotation and displays its callout view. - The `animated` parameter determines whether the map is panned to bring the - annotation on-screen, specifically: - + The `animated` parameter determines whether the selection is animated including whether the map is + panned to bring the annotation into view, specifically: + | `animated` parameter | Effect | |------------------|--------| - | `NO` | The annotation is selected, and the callout is presented. However the map is not panned to bring the annotation or callout onscreen. The presentation of the callout is animated. | - | `YES` | The annotation is selected, and the callout is presented. If the annotation is offscreen *and* is of type `MGLPointAnnotation`, the map is panned so that the annotation and its callout are brought just onscreen. The annotation is *not* centered within the viewport. | + | `NO` | The annotation is selected, and the callout is presented. However the map is not panned to bring the annotation or callout into view. The presentation of the callout is NOT animated. | + | `YES` | The annotation is selected, and the callout is presented. If the annotation is not visible (or is partially visible) *and* is of type `MGLPointAnnotation`, the map is panned so that the annotation and its callout are brought into view. The annotation is *not* centered within the viewport. | + Note that a selection initiated by a single tap gesture is always animated. + @param annotation The annotation object to select. @param animated If `YES`, the annotation and callout view are animated on-screen. @@ -1432,6 +1434,17 @@ MGL_EXPORT IB_DESIGNABLE - (void)selectAnnotation:(id <MGLAnnotation>)annotation animated:(BOOL)animated; /** + :nodoc: + Selects an annotation and displays its callout view. This method should be + considered "alpha" and as such is liable to change. + + @param annotation The annotation object to select. + @param moveIntoView If the annotation is not visible (or is partially visible) *and* is of type `MGLPointAnnotation`, the map is panned so that the annotation and its callout are brought into view. The annotation is *not* centered within the viewport. | + @param animateSelection If `YES`, the annotation's selection state and callout view's presentation are animated. + */ +- (void)selectAnnotation:(id <MGLAnnotation>)annotation moveIntoView:(BOOL)moveIntoView animateSelection:(BOOL)animateSelection; + +/** Deselects an annotation and hides its callout view. @param annotation The annotation object to deselect. diff --git a/platform/ios/src/MGLMapView.mm b/platform/ios/src/MGLMapView.mm index 52bf4e83f5..4d4bf39123 100644 --- a/platform/ios/src/MGLMapView.mm +++ b/platform/ios/src/MGLMapView.mm @@ -1768,7 +1768,7 @@ public: { CGPoint calloutPoint = [singleTap locationInView:self]; CGRect positionRect = [self positioningRectForAnnotation:annotation defaultCalloutPoint:calloutPoint]; - [self selectAnnotation:annotation moveOnscreen:YES animateSelection:YES calloutPositioningRect:positionRect]; + [self selectAnnotation:annotation moveIntoView:YES animateSelection:YES calloutPositioningRect:positionRect]; } else if (self.selectedAnnotation) { @@ -4525,7 +4525,7 @@ public: } -- (BOOL)isBringingAnnotationOnscreenSupportedForAnnotation:(id<MGLAnnotation>)annotation animated:(BOOL)animated { +- (BOOL)isMovingAnnotationIntoViewSupportedForAnnotation:(id<MGLAnnotation>)annotation animated:(BOOL)animated { // Consider delegating return animated && [annotation isKindOfClass:[MGLPointAnnotation class]]; } @@ -4577,12 +4577,17 @@ public: - (void)selectAnnotation:(id <MGLAnnotation>)annotation animated:(BOOL)animated { - MGLLogDebug(@"Selecting annotation: %@ animated: %@", annotation, MGLStringFromBOOL(animated)); + [self selectAnnotation:annotation moveIntoView:animated animateSelection:animated]; +} + +- (void)selectAnnotation:(id <MGLAnnotation>)annotation moveIntoView:(BOOL)moveIntoView animateSelection:(BOOL)animateSelection +{ + MGLLogDebug(@"Selecting annotation: %@ moveIntoView: %@ animateSelection: %@", annotation, MGLStringFromBOOL(moveIntoView), MGLStringFromBOOL(animateSelection)); CGRect positioningRect = [self positioningRectForAnnotation:annotation defaultCalloutPoint:CGPointZero]; - [self selectAnnotation:annotation moveOnscreen:animated animateSelection:YES calloutPositioningRect:positioningRect]; + [self selectAnnotation:annotation moveIntoView:moveIntoView animateSelection:animateSelection calloutPositioningRect:positioningRect]; } -- (void)selectAnnotation:(id <MGLAnnotation>)annotation moveOnscreen:(BOOL)moveOnscreen animateSelection:(BOOL)animateSelection calloutPositioningRect:(CGRect)calloutPositioningRect +- (void)selectAnnotation:(id <MGLAnnotation>)annotation moveIntoView:(BOOL)moveIntoView animateSelection:(BOOL)animateSelection calloutPositioningRect:(CGRect)calloutPositioningRect { if ( ! annotation) return; @@ -4617,8 +4622,8 @@ public: self.selectedAnnotation = annotation; // Determine if we're allowed to move this offscreen annotation on screen, even though we've asked it to - if (moveOnscreen) { - moveOnscreen = [self isBringingAnnotationOnscreenSupportedForAnnotation:annotation animated:animateSelection]; + if (moveIntoView) { + moveIntoView = [self isMovingAnnotationIntoViewSupportedForAnnotation:annotation animated:animateSelection]; } // If we have an invalid positioning rect, we need to provide a suitable default. @@ -4702,15 +4707,15 @@ public: // If the callout view provides inset (outset) information, we can use it to expand our positioning // rect, which we then use to help move the annotation on-screen if want need to. - if (moveOnscreen && [calloutView respondsToSelector:@selector(marginInsetsHintForPresentationFromRect:)]) { + if (moveIntoView && [calloutView respondsToSelector:@selector(marginInsetsHintForPresentationFromRect:)]) { UIEdgeInsets margins = [calloutView marginInsetsHintForPresentationFromRect:calloutPositioningRect]; expandedPositioningRect = UIEdgeInsetsInsetRect(expandedPositioningRect, margins); } } - if (moveOnscreen) + if (moveIntoView) { - moveOnscreen = NO; + moveIntoView = NO; // Need to consider the content insets. CGRect bounds = UIEdgeInsetsInsetRect(self.bounds, self.contentInset); @@ -4719,23 +4724,23 @@ public: if (CGRectGetMinX(calloutPositioningRect) < CGRectGetMinX(bounds)) { constrainedRect.origin.x = expandedPositioningRect.origin.x; - moveOnscreen = YES; + moveIntoView = YES; } else if (CGRectGetMaxX(calloutPositioningRect) > CGRectGetMaxX(bounds)) { constrainedRect.origin.x = CGRectGetMaxX(expandedPositioningRect) - constrainedRect.size.width; - moveOnscreen = YES; + moveIntoView = YES; } if (CGRectGetMinY(calloutPositioningRect) < CGRectGetMinY(bounds)) { constrainedRect.origin.y = expandedPositioningRect.origin.y; - moveOnscreen = YES; + moveIntoView = YES; } else if (CGRectGetMaxY(calloutPositioningRect) > CGRectGetMaxY(bounds)) { constrainedRect.origin.y = CGRectGetMaxY(expandedPositioningRect) - constrainedRect.size.height; - moveOnscreen = YES; + moveIntoView = YES; } } @@ -4756,7 +4761,7 @@ public: [self.delegate mapView:self didSelectAnnotationView:annotationView]; } - if (moveOnscreen) + if (moveIntoView) { CGPoint center = CGPointMake(CGRectGetMidX(constrainedRect), CGRectGetMidY(constrainedRect)); CLLocationCoordinate2D centerCoord = [self convertPoint:center toCoordinateFromView:self]; diff --git a/platform/macos/src/MGLMapView.mm b/platform/macos/src/MGLMapView.mm index 434f405a5f..0a07c9e057 100644 --- a/platform/macos/src/MGLMapView.mm +++ b/platform/macos/src/MGLMapView.mm @@ -2279,7 +2279,7 @@ public: [self selectAnnotation:firstAnnotation]; } -- (BOOL)isBringingAnnotationOnscreenSupportedForAnnotation:(id<MGLAnnotation>)annotation animated:(BOOL)animated { +- (BOOL)isMovingAnnotationIntoViewSupportedForAnnotation:(id<MGLAnnotation>)annotation animated:(BOOL)animated { // Consider delegating return animated && [annotation isKindOfClass:[MGLPointAnnotation class]]; } @@ -2293,12 +2293,12 @@ public: - (void)selectAnnotation:(id <MGLAnnotation>)annotation atPoint:(NSPoint)gesturePoint { MGLLogDebug(@"Selecting annotation: %@ atPoint: %@", annotation, NSStringFromPoint(gesturePoint)); - [self selectAnnotation:annotation atPoint:gesturePoint moveOnscreen:YES animateSelection:YES]; + [self selectAnnotation:annotation atPoint:gesturePoint moveIntoView:YES animateSelection:YES]; } -- (void)selectAnnotation:(id <MGLAnnotation>)annotation atPoint:(NSPoint)gesturePoint moveOnscreen:(BOOL)moveOnscreen animateSelection:(BOOL)animateSelection +- (void)selectAnnotation:(id <MGLAnnotation>)annotation atPoint:(NSPoint)gesturePoint moveIntoView:(BOOL)moveIntoView animateSelection:(BOOL)animateSelection { - MGLLogDebug(@"Selecting annotation: %@ atPoint: %@ moveOnscreen: %@ animateSelection: %@", annotation, NSStringFromPoint(gesturePoint), MGLStringFromBOOL(moveOnscreen), MGLStringFromBOOL(animateSelection)); + MGLLogDebug(@"Selecting annotation: %@ atPoint: %@ moveIntoView: %@ animateSelection: %@", annotation, NSStringFromPoint(gesturePoint), MGLStringFromBOOL(moveIntoView), MGLStringFromBOOL(animateSelection)); id <MGLAnnotation> selectedAnnotation = self.selectedAnnotation; if (annotation == selectedAnnotation) { return; @@ -2313,8 +2313,8 @@ public: [self addAnnotation:annotation]; } - if (moveOnscreen) { - moveOnscreen = [self isBringingAnnotationOnscreenSupportedForAnnotation:annotation animated:animateSelection]; + if (moveIntoView) { + moveIntoView = [self isMovingAnnotationIntoViewSupportedForAnnotation:annotation animated:animateSelection]; } // The annotation's anchor will bounce to the current click. @@ -2326,7 +2326,7 @@ public: positioningRect.origin = [self convertCoordinate:origin toPointToView:self]; } - if (!moveOnscreen && NSIsEmptyRect(NSIntersectionRect(positioningRect, self.bounds))) { + if (!moveIntoView && NSIsEmptyRect(NSIntersectionRect(positioningRect, self.bounds))) { if (!NSEqualPoints(gesturePoint, NSZeroPoint)) { positioningRect = CGRectMake(gesturePoint.x, gesturePoint.y, positioningRect.size.width, positioningRect.size.height); } @@ -2359,9 +2359,9 @@ public: [callout showRelativeToRect:positioningRect ofView:self preferredEdge:edge]; } - if (moveOnscreen) + if (moveIntoView) { - moveOnscreen = NO; + moveIntoView = NO; NSRect (^edgeInsetsInsetRect)(NSRect, NSEdgeInsets) = ^(NSRect rect, NSEdgeInsets insets) { return NSMakeRect(rect.origin.x + insets.left, @@ -2381,26 +2381,26 @@ public: if (CGRectGetMinX(positioningRect) < CGRectGetMinX(bounds)) { constrainedRect.origin.x = expandedPositioningRect.origin.x; - moveOnscreen = YES; + moveIntoView = YES; } else if (CGRectGetMaxX(positioningRect) > CGRectGetMaxX(bounds)) { constrainedRect.origin.x = CGRectGetMaxX(expandedPositioningRect) - constrainedRect.size.width; - moveOnscreen = YES; + moveIntoView = YES; } if (CGRectGetMinY(positioningRect) < CGRectGetMinY(bounds)) { constrainedRect.origin.y = expandedPositioningRect.origin.y; - moveOnscreen = YES; + moveIntoView = YES; } else if (CGRectGetMaxY(positioningRect) > CGRectGetMaxY(bounds)) { constrainedRect.origin.y = CGRectGetMaxY(expandedPositioningRect) - constrainedRect.size.height; - moveOnscreen = YES; + moveIntoView = YES; } - if (moveOnscreen) + if (moveIntoView) { CGPoint center = CGPointMake(CGRectGetMidX(constrainedRect), CGRectGetMidY(constrainedRect)); CLLocationCoordinate2D centerCoord = [self convertPoint:center toCoordinateFromView:self]; |