2016-03-23 5 views
1

У меня немного анимации, и когда эта анимация заканчивается, я хочу, чтобы приложение автоматически нажимало следующий ViewController. Хорошо, что ViewController нажимается, как 8 раз подряд! Его довольно сумасшедший.animateWithDuration Завершение блока снова и снова

вот код:

 if CGRectIntersectsRect(whichButton.frame, targetZoneImgView.frame) { 
     panGesture.cancelsTouchesInView = true 
     let buttonSnapX = UIScreen.mainScreen().bounds.width/2.0 - 35.0 
     let buttonSnapY = UIScreen.mainScreen().bounds.height - 122.0 

     UIView.animateWithDuration(0.75, delay: 0.0, 
       usingSpringWithDamping: 0.1, 
       initialSpringVelocity: 0.0, 
           options: UIViewAnimationOptions.CurveEaseOut, 
          animations: { 
           myButton.frame.origin.x = buttonSnapX 
           myButton.frame.origin.y = buttonSnapY 
          }, completion: { (finished: Bool) -> Void in 
            print("Animation done!") 
            let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil) 
            let coursesScreen = storyBoard.instantiateViewControllerWithIdentifier("coursesScreen") as! CoursesVC     
            self.navigationController!.pushViewController(coursesScreen, animated: true) 
           } 
          ) 

Это print("Animation done!") заявление также пожары, как 8-9 раз подряд, так что его на самом деле не имеет ничего общего с тем, что я толкая ViewController. Я достал код ViewController - и его все еще происходит.

В принципе, ничего Я положил completion стреляет целую кучу раз подряд.

Что происходит в мире?

+0

Я никогда не сталкивался с этим раньше, но вижу, если он остановится, если вы не используете анимацию весны. (Просто классический 'animateWithDuration: анимация: завершение:') Если это исправление, то я ставлю, что яблоко делает что-то очень глупо в своей весенней анимации! –

ответ

0

Вы можете ввести блок завершения с false значение finished переменная. Просто добавьте базовую проверку:

UIView.animateWithDuration(0.75, delay: 0.0, 
       usingSpringWithDamping: 0.1, 
       initialSpringVelocity: 0.0, 
           options: UIViewAnimationOptions.CurveEaseOut, 
          animations: { 
           myButton.frame.origin.x = buttonSnapX 
           myButton.frame.origin.y = buttonSnapY 
          }, completion: { (finished: Bool) -> Void in 
           if finished { 
            print("Animation done!") 
            let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil) 
            let coursesScreen = storyBoard.instantiateViewControllerWithIdentifier("coursesScreen") as! CoursesVC     
            self.navigationController!.pushViewController(coursesScreen, animated: true) 
           } else { 
            print("Animating...") 
           } 
          } 
         ) 
+0

Я попробовал бит 'if finished 'перед отправкой вопроса - это не сработало. Но, поскольку вы предложили это, я продолжил еще несколько исследований ... Я думаю, проблема связана скорее с тем, что жест перетаскивания вызывает все это. Когда я перетаскиваю один объект в другой - это когда эта анимация срабатывает. Поэтому его 'if CGRectIntersectsRect'. Может быть, оригинальный жест перетаскивания не отменяется, поэтому он заставляет вещи срабатывать снова и снова. Я попытался отменить сенсорное событие - не повезло. Но, может быть, у вас есть другие идеи, которые вы теперь знаете, что все это связано с жестом? – Sirab33

+0

См. Отредактированный код в исходном вопросе. Я добавил бит 'if CGRectIntersectsRect' перед всем этим. – Sirab33