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 のままです。2回目に呼び出すと、配列が空になります。
//======
私の 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
}
}