2016-10-19 3 views
0

У меня есть UIDynamicAnimator свойство определено:UIDynamicAnimator, removeAllBehaviors() не работает в первый раз

lazy fileprivate var animator: UIDynamicAnimator = { 
     return UIDynamicAnimator(referenceView: self) 
}() 

самость подкласс от UIView;

В расширения собственного класса, тот же файл, у меня есть логика с анимацией, которая использует мой аниматор, добавляет 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() анимации останавливаются, но поведение все еще остается в аниматоре. Второй раз, когда я его называю, массив становится пустым.

// ======

Для моей pushBehavior добавить действие, которое изменяет вар, указано, что я могу достичь точки назначения:

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 
    } 
} 
+0

Вы показываете абсолютно неверный код! Я не вижу 'removeAllBehaviors' в любом месте вашего кода. Пожалуйста, покажите код _that_ и покажите, как вы знаете, что поведение не удаляется. – matt

+0

@matt теперь лучше? –

+0

Да, теперь я могу ответить. – matt

ответ

1

вы говорите, тестируют, как это:

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() это команда, что поведение должна быть удалено, но команда не может быть повиновалась Теперь, потому что такое поведение по-прежнему работает, включая одного кода прямо в середине , Если бы поведение действительно остановилось прямо в тот момент, мы бы даже не достигли следующей строки вашего кода!

Таким образом, аниматор по праву не удаляет поведение до после того, как ваш код прекратил работу (также известный как конец цикла запуска).

Способ обойти это, чтобы подождать до после Ваш код остановился перед вызовом 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() 
     } 
    } 
} 
+0

Благодарим вас за ответ, но они не удаляются через несколько секунд. У меня есть какое-то действие (пусть это будет нажатие кнопки, неважно, на самом деле), и после остановки анимации я нажимаю эту кнопку, поведение все еще там –

+0

Хорошо, см. Мой пересмотренный ответ. Но я думаю, что есть нечто большее, о чем вы мне не говорите. – matt

+0

Да, это проблема. Я пытаюсь удалить поведение в методе, вызванное из свойства делегирования поведения. все анимации останавливаются, но поведение, похоже, сохраняется. благодаря! –

Смежные вопросы