iOS布局动画在GMSMapView上拖动

时间:2015-05-22 14:16:50

标签: ios google-maps animation autolayout

你可以看到比较下面两个GIF的问题。两者都缩减了#34;和"伸展"动画基于约束操作,[self layoutIfNedeed]放在-animateWithDuration块内。正如您所看到的,当地图不移动时,它可以正常工作。但是"缩水"当您开始拖动地图时,动画会立即发生。如果仔细观察,您可能会注意到cornerRadius动画仍然有效。这告诉我它可能与map(scrollView里面有什么关系?不知道google map是如何工作的)调用它自己的布局块干扰我的动画。或者可能是因为cornerRadius动画是使用CABasicAnimation而不是UIView动画完成的。

动画InfoView不是mapView的子视图。当mapView调用内部布局方法时,不确定它是否会影响我的infoView的布局。

我已尝试合并UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionOverrideInheritedDuration | UIViewAnimationOptionOverrideInheritedOptions的所有选项,看它是否有帮助。它没有。

我认为我可以直接克服这个操纵框架而不是操纵约束,它对用户看起来是一样的,但我觉得使用约束更加优雅。我尽量避免操纵帧并使用autolayout。

有什么想法导致这种情况以及如何使用自动布局动画解决这个问题?

更新

我已经尝试过直接制作动画帧 - 结果是一样的。所以它与自动布局无关。似乎当前视图动画由于某种原因而停止。

如果我用CABasicAnimation替换我的UIView动画块,它就像一个魅力。

我被要求发布一些动画代码:

- (void)shrink {

    if (!self.isStretched) return;

    self.stretched = NO;

    [self hideImageAndLabels];

    [self.indicatorView startAnimating];

    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"cornerRadius"];
    animation.duration = duration;
    animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    animation.fromValue = @0;
    animation.toValue = @(shrinkedSize / 2.0);

    [self.layer addAnimation:animation forKey:@"cornerRadiusAnimationRounded"];
    self.layer.cornerRadius = shrinkedSize / 2.0;

    self.heightConstraint.constant = shrinkedSize;
    self.widthConstraint.constant = shrinkedSize;
    self.positionYConstraint.constant = 0;
    self.triangleHeightConstraint.constant = 0;
    self.trianglePositionYConstraint.constant = 14;

    [UIView animateWithDuration:duration * 2 delay:0 usingSpringWithDamping:0.85 initialSpringVelocity:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
        [self layoutIfNeeded];
    } completion:^(BOOL finished) {
            //
    }];


}

enter image description here enter image description here

1 个答案:

答案 0 :(得分:2)

我在Google(https://code.google.com/p/gmaps-api-issues/issues/detail?id=10349)上针对此问题打开了一个错误,这是他们的回复:

  

我们的理解是发生了这种情况,因为mapView:willMove:调用是在CoreAnimation事务中进行的。我们建议的解决方法是将dispatch_async中的UIView.animateWithDuration调用包装回主线程。有点像:

     

dispatch_async(dispatch_get_main_queue(),^ {            //动画块在这里。         });

     

这有帮助吗?

将UIView.animateWithDuration块放在dispatch_async块中为我工作。