4

我用UIViewPropertyAnimator的不多(仍然是一个老式的积木人),而且我看到了一些我无法解释的行为,并且文档并没有真正提供任何见解。

为什么即使动画师在启动后立即finalPosition暂停,动画师的完成块也会被调用?.end

let view = UIView()
let animator = UIViewPropertyAnimator(duration: 4, curve: .linear, animations: {
    view.alpha = 0
})

animator.addCompletion { position in
    print("done")
    switch position {
    case .start: print("start")
    case .current: print("current")
    case .end: print("end")
    }
}

animator.startAnimation()
print("starting")
animator.pauseAnimation()
print("pausing")

输出:

starting
pausing
done
end
4

2 回答 2

2

正如@matt 所暗示的那样,问题在于您的视图不在 visibleUIWindow中,因此动画立即完成。如果您注释掉该animator.pauseAnimation()语句,您将获得相同的输出。

如果您正在使用游乐场,则可以通过创建游乐场页面来解决此view问题liveView

import PlaygroundSupport
import UIKit

let view = UIView()
PlaygroundPage.current.liveView = view

// etc.
于 2019-01-17T04:42:08.767 回答
0

如果您从 Apple 的开发者网站阅读addCompletion的文档,其中一个参数是 finalPosition。您可以使用该值来确定动画是在开始、结束还是在中间的某个位置停止。并且调用 pauseAnimation 将触发该完成块,其中某个位置位于中间位置。

参数 completion 动画完成时执行的块。该块没有返回值,并采用以下参数:

finalPosition 动画的结束位置。使用此值来确定动画是在开始、结束还是中间某处停止。

于 2019-01-17T00:01:09.483 回答