你可以看到比较下面两个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) {
//
}];
}
答案 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块中为我工作。