2016-06-30 6 views
0

Ich habe ein kleines Fragen Spiel wo, wenn der Benutzer zu lange dauert zu beantworten, es Timeout und automatisch einen benutzerdefinierten Übergang zu einem bestimmten Bildschirm auslöst.UIView Animation funktioniert nicht, wenn App in den Hintergrund geht

let firstClassView = self.sourceViewController.view 
    let secondClassView = self.destinationViewController.view 
    let screenWidth = UIScreen.mainScreen().bounds.size.width 
    let screenHeight = UIScreen.mainScreen().bounds.size.height 
    firstClassView.clipsToBounds = true 
    secondClassView.clipsToBounds = true 
    let secondClassFrame = CGRect(x: screenWidth, y: 0, width: screenWidth, height: screenHeight) 
    secondClassView.frame = secondClassFrame 
    guard let window = UIApplication.sharedApplication().keyWindow else { 
     return 
    } 
    window.insertSubview(secondClassView, aboveSubview: firstClassView) 
    if let questionVC = self.destinationViewController as? QuestionResultViewController { 
     questionVC.prepareResultView() 
    } 
    UIView.animateWithDuration(0.4, animations: {() -> Void in 
     firstClassView.frame = CGRectOffset(firstClassView.frame, -screenWidth, 0) 
     secondClassView.frame = CGRectOffset(secondClassView.frame, -screenWidth, 0) 
    }) {_ -> Void in 
     self.sourceViewController.presentViewController(self.destinationViewController, animated: false, completion: nil) 
    } 

Dieser Code und das Segue funktioniert gut, außer wenn der Benutzer die App in den Hintergrund sendet (und öffnet sie wieder) vor dem Übergang. In diesem Fall ist der UIView.animate Block erreicht, aber sein Inhalt scheint nie aufgerufen zu werden, so dass keine Animation abgespielt wird! (Ich habe einen Druckbefehl in dort, und es wurde nicht ausgelöst wird)

Wenn meine Beschreibung verwirrend war:

Fall 1:

  • Benutzer erreicht Frage Bildschirm

  • Frage des Timer-Zeitüberschreitung

  • Segue-Trigger

  • Animationsblock erreicht und spielt perfekt

Fall 2:

  • Benutzer erreicht Frage Bildschirm

  • Sendet App Hintergrund

  • App öffnet wieder

  • Frage der Timer abläuft

  • Segue löst

  • Animations Block erreicht ist, aber es passiert nichts -> ???

Warum passiert das? Ich habe versucht mit layoutIfNeeded und es ist Variationen, aber nichts hat funktioniert. Der Inhalt des Animationsblocks wird nie aufgerufen. Bei meinen Tests mit Haltepunkten stoppt die App vollständig, bevor sie die UIView-Zeile erreicht (und stürzt nach ~ 10 Sekunden ab).

Antwort

1

Es stellt sich heraus, dass es nichts mit dem UIView-Block zu tun hatte. Ich hatte eine benutzerdefinierte UILabel-Klasse, und die Methode layoutSubviews führte zu einer nicht erfassbaren Endlosschleife, nachdem die App in den Hintergrund gegangen war.

Sorry für die Verwirrung.

+0

Ihr Code ist keine korrekte benutzerdefinierte Präsentationsanimation, so dass Sie nicht überrascht sein können, wenn etwas kaputt geht. Sie können nicht einfach mit Frames herumspielen und einen presentViewController machen. Sie müssen eine geeignete benutzerdefinierte Präsentationsanimation schreiben. Was Sie tun, war _always_ falsch. – matt

+0

Können Sie mich mit einem korrekten Beispiel verknüpfen? – Swordz

+0

https://github.com/matnteub/Programming-iOS-Book-Examples/blob/master/bk2ch06p302addingPresentationController/PresentationController/ViewController2.swift – matt

Verwandte Themen