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。第一次调用确保应用了任何布局更改。假设logoViewanimateView 的父视图:

- (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 动画发生的速度比指定的秒数快的主要内容,如果未能解决你的问题,请参考以下文章

如何为 UIView 动画设置相同的速度

Xamarin iOS - 具有速度的 UIView 动画

减慢动画中的 UIView 动画

iOS开发:计算两个事件之间经过的秒数的简单方法是啥?

如何使 UIBezierPath 中的两条线以不同的速度进行动画处理

有没有一种解决方案可以让您在线程中每隔指定的秒数执行一项任务而不让它进入睡眠状态?