2016-03-23 17 views
1

Ich habe eine kleine Animation gehen, bekommt und wenn die Animation endet mag ich die App, um automatisch die nächsten ViewController auf drücken. Nun, dass ViewController wird wie 8 mal hintereinander gedrückt! Es ist ziemlich verrückt.animateWithDuration Completion Block Feuer immer und immer wieder

hier ist der Code:

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

Die print("Animation done!") Aussage auch wie 8-9-mal in Folge ausgelöst, so dass sie wirklich nichts mit der Tatsache zu tun, dass ich eine Viewcontroller bin schieben. Ich nahm den ViewController Code heraus - und es geschieht immer noch.

Grundsätzlich etwas ich in completion gelegt wird eine ganze Reihe von Mal in Folge zu schießen.

Was in der Welt ist los?

+0

Ich habe nie persönlich davor gelaufen, aber sehen Sie, ob es aufhört, wenn Sie keine Federanimation verwenden. (Nur ein klassisches 'animateWithDuration: animations: completion:') Wenn das das Problem behebt, dann wette ich, dass Apple in ihren Frühlingsanimationen etwas sehr albernes macht! –

Antwort

0

Sie können den Abschlussblock mit false Wert von finished Variable eingeben. Fügen Sie einfach eine grundlegende Überprüfung hinzu:

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

Ich habe das 'if finished'-Bit versucht, bevor ich die Frage gepostet habe - es hat nicht funktioniert. Aber seit du es vorgeschlagen hast, ging ich noch etwas weiter ... Ich denke, das Problem hat mehr damit zu tun, dass eine schleppende Geste diese ganze Sache auslöst. Wenn ich ein Objekt in eine anderen ziehen - das ist, wenn diese Animation Tritt in So sein 'wenn CGRectIntersectsRect'.. Vielleicht wird die ursprüngliche Ziehgeste nicht abgebrochen, so dass das Ding immer wieder ausgelöst wird. Ich habe versucht, das Touch-Event abzubrechen - kein Glück. Aber vielleicht hast du noch andere Ideen, die dir jetzt bekannt sind, dass alles mit einer Geste verbunden ist? – Sirab33

+0

Siehe bearbeiteten Code in der ursprünglichen Frage. Ich fügte hinzu, die 'wenn CGRectIntersectsRect' Bit vor der ganzen Sache. – Sirab33