2016-03-23 25 views
1

Küçük bir animasyon görüyorum ve bu animasyon bittiğinde, Uygulamanın bir sonraki ViewController numarasını otomatik olarak itmesini istiyorum. Peki ViewController üst üste 8 kez gibi itilir! Oldukça çılgın.animateWithDuration Tamamlama bloğu tekrar tekrar tetikleniyor

burada kod: bildiride de onun gerçekten bir ViewController itiyorum gerçeği ile ilgisi yok bu yüzden, üst üste 8-9 kez gibi ateşler

 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!") O. ViewController kodunu çıkardım - ve hala gerçekleşiyor.

Temel olarak, bir şeycompletion içine koymak bir satırda bir sürü kez ateş ediyor.

Dünyada neler oluyor?

+0

Daha önce hiçbir zaman kişisel olarak buna katılmıyorum, fakat bir bahar animasyonu kullanmıyorsanız durup durmadığını görün. (Sadece klasik bir animasyon olanDuvarYunama: animasyonlar: tamamlama: ') Eğer bunu düzeltirse, bahse girerim, elmanın ilkbahar animasyonlarında çok saçma bir şey yaptığını söyleyebilirim! –

cevap

0

finished değişkeninin false değeri ile tamamlama bloğunu girebilirsiniz. Sadece bir temel kontrol ekleyin:

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

Soruyu göndermeden önce biti 'denedim - işe yaramadı. Ama siz önerdiğinizden beri, biraz daha keşif yaptım ... Sanırım problem, sürükleyici bir hareketin her şeyi tetiklediği gerçeğiyle daha çok şey var. Bir nesneyi diğerine sürüklediğimde - bu animasyon başladığı zaman. Yani eğer CGRectIntersectsRect ise. Belki de orijinal sürükleme hareketi iptal edilmiyor, bu yüzden bir şeyin tekrar tekrar tetiklenmesini sağlıyor. Dokunma olayını iptal etmeye çalıştım - şans yok. Ama belki şu anda başka bir fikrin var mı? – Sirab33

+0

Orijinal soruda düzenlenmiş kodu görün. CGRectIntersectsRect'in her şeyden önce bittiğini ekledim. – Sirab33