0

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
    }
}
4

1 に答える 1