【问题标题】:Why is -animateWithDuration:delay:options:animations:completion: blocking the UI?为什么 -animateWithDuration:delay:options:animations:completion: 阻塞 UI?
【发布时间】:2012-04-15 13:54:26
【问题描述】:

我一直认为 Core Animation 在背景上执行动画。当我运行此代码时,我的 UI 交互会被阻止,直到动画结束:

[UIView animateWithDuration:4.5 
                      delay:0 
                    options:options 
                 animations:^{
                    oldView.alpha = 0;
                    newView.alpha = 1;
                 }  
                 completion:^(BOOL finished) {
                    if (finished) {
                        [oldView removeFromSuperview];
                    }
                 }];

如您所见,持续时间很长,因此可以清楚地看到 UI 交互在制作动画时被阻止。

UI交互在动画开始时开始被阻塞,在动画结束时被阻塞。

有没有办法同时启动一个 UIView 动画,这样 UI 交互就不会被阻塞?

编辑澄清:我知道 UI 被阻止,因为我无法与屏幕上的 任何 控件交互,为什么该动画正在运行。这些其他控件与正在动画的内容无关,并且不在视图层次结构中的同一分支上。此动画运行时,整个 UI 都被阻止。当我将其设置为 10 秒时,UI 会在动画运行时被阻止 10 秒。在 iPhone 4 上使用 iOS 4.2 测试。

【问题讨论】:

  • 你怎么知道它被屏蔽了?除非一个视图的 alpha 为零,否则它后面的所有视图都会禁用交互。
  • 用澄清更新了问题。

标签: iphone ios ipad uikit core-animation


【解决方案1】:

查看 UIView 的文档,我在该方法的讨论部分发现了这一点:

在动画期间,用户交互会暂时禁用动画视图。 (在 iOS 5 之前,整个应用程序都禁用了用户交互。)如果您希望用户能够与视图交互,请在 options 参数中包含 UIViewAnimationOptionAllowUserInteraction 常量。

因此,如果您希望继续允许用户交互,则必须在 options 参数中设置此常量。

【讨论】:

    【解决方案2】:

    文档是你的朋友 :)

    UIView Class Reference

    animateWithDuration:animations:

    “在动画过程中,正在动画的视图会暂时禁用用户交互。(在 iOS 5 之前,整个应用程序都禁用用户交互。)”

    当然,对于动画视图下的所有视图。

    【讨论】:

    • UIViewAnimationOptionAllowUserInteraction 试试 jmstone 的方法 - 希望它能成功 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 2012-08-23
    • 2012-10-19
    相关资源
    最近更新 更多