暂停时调用 UIViewPropertyAnimator 完成
UIViewPropertyAnimator completion called when paused
我没怎么用过 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
如果您从 Apple 的开发者网站阅读 addCompletion 的文档,
其中一个参数是 finalPosition。您可以使用该值来确定
动画是在开始、结束还是中间某处停止。
调用 pauseAnimation 将触发中间位置某处的完成块。
Parameters completion A block to execute when the animations finish.
This block has no return value and takes the following parameter:
finalPosition The ending position of the animations. Use this value to
determine whether the animations stopped at the beginning, end, or
somewhere in the middle.
正如@matt 提到的,问题是您的视图不在可见的 UIWindow
中,因此动画会立即完成。如果注释掉 animator.pauseAnimation()
语句,您会得到相同的输出。
如果您使用的是游乐场,则可以通过将游乐场页面的 view
设为 liveView
来解决此问题:
import PlaygroundSupport
import UIKit
let view = UIView()
PlaygroundPage.current.liveView = view
// etc.
我没怎么用过 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
如果您从 Apple 的开发者网站阅读 addCompletion 的文档, 其中一个参数是 finalPosition。您可以使用该值来确定 动画是在开始、结束还是中间某处停止。 调用 pauseAnimation 将触发中间位置某处的完成块。
Parameters completion A block to execute when the animations finish. This block has no return value and takes the following parameter:
finalPosition The ending position of the animations. Use this value to determine whether the animations stopped at the beginning, end, or somewhere in the middle.
正如@matt 提到的,问题是您的视图不在可见的 UIWindow
中,因此动画会立即完成。如果注释掉 animator.pauseAnimation()
语句,您会得到相同的输出。
如果您使用的是游乐场,则可以通过将游乐场页面的 view
设为 liveView
来解决此问题:
import PlaygroundSupport
import UIKit
let view = UIView()
PlaygroundPage.current.liveView = view
// etc.