[iOS] Defer didChange until after animation

Fixes #2436.
This commit is contained in:
Minh Nguyễn
2015-11-05 13:28:17 -08:00
parent ff801dc2a8
commit 99211bc168

View File

@@ -1650,6 +1650,7 @@ std::chrono::steady_clock::duration secondsAsDuration(float duration)
- (void)_setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate zoomLevel:(double)zoomLevel direction:(CLLocationDirection)direction animated:(BOOL)animated
{
NSTimeInterval duration = animated ? MGLAnimationDuration : 0;
mbgl::CameraOptions options;
options.center = MGLLatLngFromLocationCoordinate2D(centerCoordinate);
options.zoom = fmaxf(zoomLevel, self.currentMinimumZoom);
@@ -1659,14 +1660,25 @@ std::chrono::steady_clock::duration secondsAsDuration(float duration)
}
if (animated)
{
options.duration = secondsAsDuration(MGLAnimationDuration);
options.duration = secondsAsDuration(duration);
options.easing = MGLUnitBezierForMediaTimingFunction(nil);
}
_mbglMap->easeTo(options);
[self unrotateIfNeededAnimated:animated];
[self notifyMapChange:(animated ? mbgl::MapChangeRegionDidChangeAnimated : mbgl::MapChangeRegionDidChange)];
if (animated)
{
__weak MGLMapView *weakSelf = self;
[self animateWithDelay:duration animations:^
{
[weakSelf notifyMapChange:mbgl::MapChangeRegionDidChangeAnimated];
}];
}
else
{
[self notifyMapChange:mbgl::MapChangeRegionDidChange];
}
}
+ (NS_SET_OF(NSString *) *)keyPathsForValuesAffectingZoomLevel
@@ -1780,7 +1792,18 @@ mbgl::LatLngBounds MGLLatLngBoundsFromCoordinateBounds(MGLCoordinateBounds coord
[self unrotateIfNeededAnimated:duration > 0];
[self notifyMapChange:(duration > 0 ? mbgl::MapChangeRegionDidChangeAnimated : mbgl::MapChangeRegionDidChange)];
if (duration > 0)
{
__weak MGLMapView *weakSelf = self;
[self animateWithDelay:duration animations:^
{
[weakSelf notifyMapChange:mbgl::MapChangeRegionDidChangeAnimated];
}];
}
else
{
[self notifyMapChange:mbgl::MapChangeRegionDidChange];
}
}
+ (NS_SET_OF(NSString *) *)keyPathsForValuesAffectingDirection
@@ -1805,8 +1828,19 @@ mbgl::LatLngBounds MGLLatLngBoundsFromCoordinateBounds(MGLCoordinateBounds coord
CGFloat duration = (animated ? MGLAnimationDuration : 0);
_mbglMap->setBearing(direction, secondsAsDuration(duration));
[self notifyMapChange:(animated ? mbgl::MapChangeRegionDidChangeAnimated : mbgl::MapChangeRegionDidChange)];
if (animated)
{
__weak MGLMapView *weakSelf = self;
[self animateWithDelay:duration animations:^
{
[weakSelf notifyMapChange:mbgl::MapChangeRegionDidChangeAnimated];
}];
}
else
{
[self notifyMapChange:mbgl::MapChangeRegionDidChange];
}
}
- (void)setDirection:(CLLocationDirection)direction
@@ -1947,6 +1981,19 @@ mbgl::LatLngBounds MGLLatLngBoundsFromCoordinateBounds(MGLCoordinateBounds coord
options.easing = MGLUnitBezierForMediaTimingFunction(function);
}
_mbglMap->easeTo(options);
if (duration > 0)
{
__weak MGLMapView *weakSelf = self;
[self animateWithDelay:duration animations:^
{
[weakSelf notifyMapChange:mbgl::MapChangeRegionDidChangeAnimated];
}];
}
else
{
[self notifyMapChange:mbgl::MapChangeRegionDidChange];
}
}
- (CLLocationCoordinate2D)convertPoint:(CGPoint)point toCoordinateFromView:(nullable UIView *)view