当前位置: 首页 > 知识库问答 >
问题:

iOS-UIView animateWithDuration中的完成块调用得太早

孙朝明
2023-03-14

当表格视图单元格被选中时,我试图做一些动画。由于某种原因,完成块被调用得太早了。即使将持续时间设置为10秒,完成块也会立即被调用。

[UIView animateWithDuration:10.0 animations:^{
    message.frame = newFrame;
} completion:^(BOOL finished) {
    NSLog(@"DONE???");
}];

你有没有想过为什么会这样?谢谢

共有3个答案

阴飞星
2023-03-14

如果动画没有效果,也可以提前调用完成,例如将视图的alpha设置为其已有的值。

狄安歌
2023-03-14

对它被调用得太早,因为它被某种方式打断了。可能是通过模态呈现过渡或其他方式。根据您的需要,以下可能是您喜欢的解决方案。我们通过手动延迟动画代码的执行来避免冲突,如下所示:

// To get this in Xcode very easily start typing, "dispatch_aft..."

// Note the "0.2". This ensures the outstanding animation gets completed before we start ours
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    [UIView animateWithDuration:1.0 delay:0 options:0 animations:^{
        // Your animation code
    } completion:^(BOOL finished) {
        // Your completion code
    }];
});
章宏恺
2023-03-14

从UIView文档中:

完成

动画序列结束时要执行的块对象。此块没有返回值,只接受一个布尔参数,该参数指示动画是否在调用完成处理程序之前实际完成。如果动画的持续时间为0,则在下一个运行循环循环开始时执行此块。此参数可能为空。

这意味着不能保证代码只有在动画完成时才会执行。我建议您检查“完成”参数作为执行的条件。

 类似资料:
  • 我在我正在开发的应用程序中发现了一个奇怪的错误。在我进入细节之前,我将陈述我的问题 1-为什么不能调用UIView动画完成块 2-为什么在显示模式视图后会调用UIView动画完成块? 我有一系列UIView动画,它们在视图控制器出现后开始。他们有完成块。绝大多数情况下,动画完成块都会被调用。但每隔一段时间,应用程序就会进入一种状态,完成块不会被调用。 此外,当我从当前视图控制器模态地呈现一个新的视

  • 我有一个用于交互式过渡的自定义动画师。还有一个,根据过渡进度设置为。效果的动画代码如下: 我通过调用它,当从它到第一个的转换开始时,它在第二个上调用。 然而,我这里有一个问题。在动画结束之前调用完成块。当我第一次运行转换(没有取消它)时,它工作得很好,但在随后的运行过程中,它就不工作了。 我也曾尝试将动画添加到我的动画师中,但也没有成功。 此外,当我取消转换时,在实际动画结束之前调用完成块(在这种

  • 每当此动画结束时,我都会尝试调用一个方法,但在某些情况下,例如,当用户离开应用程序时,它的完成块永远不会被调用。此外,当VC与UIView动画同时出现时,完成块永远不会被调用。 即使动画以某种方式中断,我应该如何确保调用回调?我是否应该根本不使用UIView动画完成块,而是使用其他内容?请开导我。。!

  • 基于UIView的block的动画允许你在动画结束的时候提供一个完成的动作。CATranscation接口提供的+setCompletionBlock:方法也有同样的功能。我们来调整上个例子,在颜色变化结束之后执行一些操作。我们来添加一个完成之后的block,用来在每次颜色变化结束之后切换到另一个旋转90的动画。代码见清单7.3,运行结果见图7.2。 清单7.3 在颜色动画完成之后添加一个回调 -

  • 非常简单的动画: 动画工作得很好。但是,完成块被调用了两次。这也很好,我知道我需要检查布尔值,看看它是否真的完成了。嗯,不仅完成块被调用了两次,而且两次都完成了。 我怎么知道动画是否真的完成了?

  • 我对Maven还很陌生,不确定各个组件的正确角色。 我一直使用以下Maven-project结构来开发微服务: 那么,为什么父级中的插件要为每个子级执行,我如何防止这种情况呢?我仍然在项目的早期阶段,所以我可以重组模块结构,如果合适的话。 我尝试了https://stackoverflow.com/a/14653088/11249中建议的解决方案,但无法使其对我有效。