UIView 动画发生的速度比指定的秒数快
Posted
技术标签:
【中文标题】UIView 动画发生的速度比指定的秒数快【英文标题】:UIView Animation happens faster than specified seconds 【发布时间】:2016-08-01 12:31:12 【问题描述】:我有一个带有图像的视图,其中显示了一些文本。 我需要执行动画,最终显示完整的文本。
我的界面中有一个徽标视图,上面有动画视图。对于动画视图,前导、尾随、顶部和底部约束是基于 superView(徽标视图)设置的。
我已尝试以下代码,但我指定的持续时间无法正常工作。
- (void) animateLogo
[UIView animateWithDuration:10.0 animations:^
NSLog(@"animation started");
if (self.animateViewLeadingConstraint.constant < 94) //94 is the total width of the logo view
self.animateViewLeadingConstraint.constant = self.animateViewLeadingConstraint.constant + 1;
else
self.animateViewLeadingConstraint.constant = 0;
completion:^(BOOL finished)
NSLog(@"animation ended");
[self.animateView layoutIfNeeded];
[self animateLogo];
];
我已经附上了持续时间的日志
2016-08-01 17:55:27.317 sample[20361:481531] animation started
2016-08-01 17:55:27.318 sample[20361:481531] animation ended
2016-08-01 17:55:27.318 sample[20361:481531] animation started
2016-08-01 17:55:27.318 sample[20361:481531] animation ended
2016-08-01 17:55:27.318 sample[20361:481531] animation started
2016-08-01 17:55:27.319 sample[20361:481531] animation ended
2016-08-01 17:55:27.319 sample[20361:481531] animation started
2016-08-01 17:55:27.319 sample[20361:481531] animation ended
我不确定我在上面的代码中犯了什么错误,或者我误解了 UIView 动画的概念
任何帮助或提示将不胜感激。
【问题讨论】:
这个动画要无限重复?你最好重复使用CABasicAnimation
。
@rckoenes 你的意思是使用 CABasicAnimation 我们可以做到这一点?
是的,你可以,而且会更好地重复,
@rckoenes 我会试试的。感谢您的帮助!
【参考方案1】:
看到这个答案:How do I animate constraint changes?
您应该在动画块之前和animations:
块本身中调用动画视图的父视图上的layoutIfNeeded
。第一次调用确保应用了任何布局更改。假设logoView
是animateView
的父视图:
- (void) animateLogo
self.animateViewLeadingConstraint.constant = 0.0;
[self.logoView layoutIfNeeded];
[UIView animateWithDuration:10.0 animations:^
NSLog(@"animation started");
self.animateViewLeadingConstraint.constant = 94.0;
[self.logoView layoutIfNeeded];
completion:^(BOOL finished)
NSLog(@"animation ended");
];
【讨论】:
感谢主题。我想知道为什么持续时间秒数没有按预期工作你知道原因吗?或者你能详细说明一下吗? 如你所见,如果你不调用layoutIfNeeded
,动画会立即发生。您是否更改了代码,但仍然不正确?
另外,如果您没有正确设置动画。您的 animations
块应该只将常量设置为 94 而不是递增。不要在 completion
块中调用 animateLogo
。动画负责为您完成整个动画。您不必每一步都移动它。
如果您想在动画完成后将其移回,请在您的 completion
块中,将常量设置为 0 并再次调用 layoutIfNeeded
。
刚刚做了另一个编辑。您需要在动画视图的父视图上调用 layoutIfNeeded。另外,你有没有看过你的其他限制?您的animateView
抗压性应该足够低,以允许视图减小其宽度。【参考方案2】:
最后,我得到了基于@stevekohls cmets 的解决方案
- (void) animateLogo
self.animateViewLeadingConstraint.constant = 0;
[UIView animateWithDuration:5.0f animations:^
self.animateViewLeadingConstraint.constant = 94.0;
[self.view layoutIfNeeded];
completion:^(BOOL finished)
[UIView animateWithDuration:0.5f animations:^
self.animateView.alpha = 0;
completion:^(BOOL finished)
self.animateViewLeadingConstraint.constant = 0;
[self.view layoutIfNeeded];
self.animateView.alpha = 1.0f;
[self animateLogo];
];
];
【讨论】:
以上是关于UIView 动画发生的速度比指定的秒数快的主要内容,如果未能解决你的问题,请参考以下文章