UIDynamicAnimator,removeAllBehaviors() 第一次不起作用
UIDynamicAnimator, removeAllBehaviors() doesn't work at first time
我定义了 UIDynamicAnimator 属性:
lazy fileprivate var animator: UIDynamicAnimator = {
return UIDynamicAnimator(referenceView: self)
}()
自己是来自 UIView 的子class;
在自身 class 的扩展中,同一个文件,我有动画逻辑,使用我的动画师,添加 UIDynamicBehavior 项目:
let pushBehavior = UIPushBehavior(items: [stampView], mode: .continuous)
//some settings
let dynamicItemBehavior = UIDynamicItemBehavior(items: [stampView])
//some settings
let gravityBehavior = UIGravityBehavior(items: [stampView])
//some settings
let collisionBehavior = UICollisionBehavior(items: [stampView])
//some settings
一切正常,但当我尝试使用 removeAllBehaviors() 停止所有动画时,动画停止,但所有行为仍在 animator.behaviors。第二次调用时,数组变空了。
//======
对于我的 pushBehavior,我添加了一个动作,它改变了 var,表明我到达了目的地点:
pushBehavior.action = { [unowned stampView] in
if stampView.center.x <= endPosition.x {
lastJump = true
}
}
在 collisionBehavior 委托方法中,我检查了这个变量并尝试使用 removeAllBehaviors() 停止动画
public func collisionBehavior(_ behavior: UICollisionBehavior, beganContactFor item: UIDynamicItem, withBoundaryIdentifier identifier: NSCopying?, at p: CGPoint) {
if lastJump {
//animator.behaviors.count = 4
animator.removeAllBehaviors()
//still, animator.behaviors.count = 4
}
}
你说你是这样测试的:
public func collisionBehavior(_ behavior: UICollisionBehavior, beganContactFor item: UIDynamicItem, withBoundaryIdentifier identifier: NSCopying?, at p: CGPoint) {
if lastJump {
//animator.behaviors.count = 4
animator.removeAllBehaviors()
//still, animator.behaviors.count = 4
}
}
嗯,animator.removeAllBehaviors()
是一个命令,应该 删除行为,但不能遵守该命令现在,因为这些行为仍在运行,包括您的代码就在 中间的行为。如果行为真的在那一刻停止,我们甚至都不会到达您代码的下一行!
因此,动画师在您的代码停止 运行ning(也称为 运行循环)。
解决此问题的方法是等到 代码停止后再调用 removeAllBehaviors()
。您可以使用我的 delay
实用程序 () 轻松做到这一点:
public func collisionBehavior(_ behavior: UICollisionBehavior, beganContactFor item: UIDynamicItem, withBoundaryIdentifier identifier: NSCopying?, at p: CGPoint) {
if lastJump {
delay(0.1) {
animator.removeAllBehaviors()
}
}
}
我定义了 UIDynamicAnimator 属性:
lazy fileprivate var animator: UIDynamicAnimator = {
return UIDynamicAnimator(referenceView: self)
}()
自己是来自 UIView 的子class;
在自身 class 的扩展中,同一个文件,我有动画逻辑,使用我的动画师,添加 UIDynamicBehavior 项目:
let pushBehavior = UIPushBehavior(items: [stampView], mode: .continuous)
//some settings
let dynamicItemBehavior = UIDynamicItemBehavior(items: [stampView])
//some settings
let gravityBehavior = UIGravityBehavior(items: [stampView])
//some settings
let collisionBehavior = UICollisionBehavior(items: [stampView])
//some settings
一切正常,但当我尝试使用 removeAllBehaviors() 停止所有动画时,动画停止,但所有行为仍在 animator.behaviors。第二次调用时,数组变空了。
//======
对于我的 pushBehavior,我添加了一个动作,它改变了 var,表明我到达了目的地点:
pushBehavior.action = { [unowned stampView] in
if stampView.center.x <= endPosition.x {
lastJump = true
}
}
在 collisionBehavior 委托方法中,我检查了这个变量并尝试使用 removeAllBehaviors() 停止动画
public func collisionBehavior(_ behavior: UICollisionBehavior, beganContactFor item: UIDynamicItem, withBoundaryIdentifier identifier: NSCopying?, at p: CGPoint) {
if lastJump {
//animator.behaviors.count = 4
animator.removeAllBehaviors()
//still, animator.behaviors.count = 4
}
}
你说你是这样测试的:
public func collisionBehavior(_ behavior: UICollisionBehavior, beganContactFor item: UIDynamicItem, withBoundaryIdentifier identifier: NSCopying?, at p: CGPoint) {
if lastJump {
//animator.behaviors.count = 4
animator.removeAllBehaviors()
//still, animator.behaviors.count = 4
}
}
嗯,animator.removeAllBehaviors()
是一个命令,应该 删除行为,但不能遵守该命令现在,因为这些行为仍在运行,包括您的代码就在 中间的行为。如果行为真的在那一刻停止,我们甚至都不会到达您代码的下一行!
因此,动画师在您的代码停止 运行ning(也称为 运行循环)。
解决此问题的方法是等到 代码停止后再调用 removeAllBehaviors()
。您可以使用我的 delay
实用程序 () 轻松做到这一点:
public func collisionBehavior(_ behavior: UICollisionBehavior, beganContactFor item: UIDynamicItem, withBoundaryIdentifier identifier: NSCopying?, at p: CGPoint) {
if lastJump {
delay(0.1) {
animator.removeAllBehaviors()
}
}
}