ios - 了解 UIView.animate 以及完成闭包的工作原理

标签 ios swift animation closures completion

有没有一种方法可以中断动画,而不是“取消”(倒回)它们,而是“快进”它们,迫使它们的完成闭包比原计划更早运行?

背景:

在 IOS 中,可以“使用持续时间为 View 设置动画”并包含一个完成闭包...使用 UIView 的静态方法 animate(),如下所示:

class func animate(withDuration: TimeInterval, animations: () -> Void, completion: ((Bool) -> Void)? = nil)

现实生活中的例子可能看起来像EXHIBIT-A:

// assume we have a UILabel named 'bigLabel'

func animationWeNeedToDo() {

            UIView.animate(withDuration: 1, animations: {
                self.bigLabel.alpha = 0
            }, completion: {
                if $0 {
                    UIView.animate(withDuration: 1, animations: {
                        self.bigLabel.center.x -= 20
                    }, completion: {
                        if $0 {
                            self.updateMainDisplay()
                        }
                    }) }
            })
        }

所以我们有一个 UILabel,bigLabel,我们首先将其设置为“淡入淡出”动画,然后我们链接到第一个完成时的另一个动画,然后再次完成第二,我们运行最重要的函数 updateMainDisplay()。

但是这个简单的示例可能会复杂得多,涉及更多的 View 。执行 updateMainDisplay() 可能是必要的。 ;)

updateMainDisplay() 函数很重要,因为它“重置”了所有 View ,将应用程序返回到类似于应用程序最初启动时的中立状态……有点“重新校准”一切。

无论如何,问题是,如果用户在动画发生时做了一些事情,比如足够早地按下主页按钮或继续到一个新的事件(模态,比如设置......然后回来),它永远不会完成... 因此 updateMainDisplay() 没有被执行! ...事情变得复杂和令人讨厌。

那么,如何处理这个问题呢?

似乎需要在“onPause()”中完成一些事情(我知道这不是 Android)...比如确保取消动画并执行 updateMainDisplay()。

但为了做到这一点,您必须检查“onPause()”方法中的各种 bool 状态。如果有一种方法可以保证动画将完成,我会更愿意。

所以,再一次,我认为如果有一种方法不取消动画,而是“强制立即完成”所有动画,那将是非常棒的。

这是伪代码...但是有没有办法做这样的事情:

var myAnimation = (animation) { // EXHIBIT-A from above } 

myAnimation.execute()

// if needed:

myAnimation.forceCompletionNow()

有人知道这是否可能吗?

谢谢。

最佳答案

您的代码的问题在于您正在检查完成闭包的第一个参数。这表明动画是否完成。如果是这样,您只运行 updateMainDisplay()

所以事实上,即使动画没有完成,完成处理程序也会被调用。是告诉它如果动画没有完成就什么都不做。

要解决此问题,只需删除 if $0 语句即可。

现在 Xcode 将显示警告,因为您没有使用闭包的第一个参数。要消除此警告,只需将 _ in 放在闭包的开头:

{ _ in
    // some code
}

您可以尝试的另一件事是 CABasicAnimation这不会实际上 更改 View 的属性。它为 CALayer 设置动画。如果您以某种方式再次更新 View , View 将回到动画之前的原始状态。您似乎想在动画结束后重置所有内容,因此这可能适合您。

关于ios - 了解 UIView.animate 以及完成闭包的工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49811462/

相关文章:

ios - 使用 Eureka 框架选择多行

swift - 如何从组合框中获取值,将其与字典中的键匹配并更新文本字段中键的值?

ios - 为什么 Xcode 调试器不显示类型信息?

ios - UITableView 分段

swift - 在添加完成 block 之前触发 Alamofire 网络请求?

ios - iOS开发中Views的正确使用方法是什么?

javascript - Canvas - 旋转我的图像(圆圈)

javascript - 拉斐尔连续动画

javascript - 如何将 Spine 动画添加到 Phaser 游戏?

ios - 点击通过 UISlider