我定义了UIDynamicAnimator属性:
lazy fileprivate var animator: UIDynamicAnimator = {
return UIDynamicAnimator(referenceView: self)
}()self是UIView的子类;
在扩展名为self类的同一个文件中,我有使用我的动画的逻辑,它使用我的动画器,添加了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
}
}发布于 2016-10-19 16:31:25
你说你要这样测试:
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()是一个应该删除行为的命令,但是现在不能遵守该命令,因为这些行为仍然在运行,包括您的代码正在运行的那个。如果行为在那一刻就停止了,我们甚至永远不会到达您的代码的下一行!
因此,动画师实际上不会删除这些行为,直到您的代码停止运行(也称为run循环的结束)。
在调用removeAllBehaviors()之前,如何解决这个问题,直到代码停止时才开始工作。您可以使用我的delay实用程序(https://stackoverflow.com/a/24318861/341994)轻松地做到这一点:
public func collisionBehavior(_ behavior: UICollisionBehavior, beganContactFor item: UIDynamicItem, withBoundaryIdentifier identifier: NSCopying?, at p: CGPoint) {
if lastJump {
delay(0.1) {
animator.removeAllBehaviors()
}
}
}https://stackoverflow.com/questions/40136098
复制相似问题