2013-08-16 11 views
20

Meine App läuft in iOS6 einwandfrei, aber in einer unangegebenen kommenden Version von iOS, die ich aus NDA-Gründen nicht benennen kann, funktionieren alle Übergangsanimationen UIViewController nicht mehr. Neue Ansichten erscheinen sofort. Ich bin mir nicht sicher, ob diese unangegebene zukünftige Version von iOS die Ursache ist, wie ich gelegentlich in iOS6 gesehen habe.UIViewController-Animationen funktionieren nicht mehr

Manchmal fangen Animationen an, eine Weile zu arbeiten und hören dann kurz danach auf, was mich zu der Annahme verleitet, dass es sich um eine Art Speicherwarnung handelt, aber meine App verwendet meist recht vernünftige ~ 125 MB RAM. Kann mir jemand Ratschläge geben oder Dinge untersuchen?

+0

Weitere Daten würden hier nützlich sein. Was animierst du und wie? Können Sie einen relevanten Code posten?Andernfalls haben Sie möglicherweise mehr Glück in den Apple Dev-Foren. –

+0

Ich mache absolut normal [self.navigationController pushViewController: viewController animiert: YES] - Stil View Controller-Übergänge. Leider sind die Apple Dev-Foren im Vergleich zu SO nach meiner Erfahrung etwas öde, aber ich habe dort auch einen Thread geöffnet. –

+0

Sie verwenden überhaupt keine benutzerdefinierten Unterklassen von UIViewControllern? Nur Teile auf Lager? Ich habe noch nie von Animationen gehört, die wegen des Speicherdrucks stoppen. das scheint unwahrscheinlich. – Jeff

Antwort

39

Das beschriebene Verhalten hat es immer gegeben: Wenn Sie mit Hintergrundthreads arbeiten und dann Methoden aufrufen und UIKit, dann wird das Update oft auf seltsame Weise verzögert.

Aus diesem Grund sollten Sie immer dispatch_async auf die Hauptwarteschlange, um die Benutzeroberfläche zu aktualisieren.

Diese Bugs sind sehr schwer zu fangen, da sie nicht immer vorhersehbar auftreten.

Um sie zu fangen, habe ich eine Methode erstellt, die einige UIKit-Methoden swizzled, um zu überprüfen, ob sie im Hauptthread aufgerufen werden. Auf diese Weise können Sie an einem symbolischen Haltepunkt anhalten, wenn Sie vergessen haben, zurück in die Hauptwarteschlange zu gelangen.

https://github.com/Cocoanetics/DTFoundation/blob/develop/Core/Source/iOS/Debug/UIView%2BDTDebug.m

+0

Dieser Code ist genau wie ich die Hintergrund-Thread-Sachen gefunden habe. –

+0

Von iHunter-Quelle benötigen Sie DTObjectBlockExecutor, NSObject + DTRuntime und UIView + DTDebug, um die Ansichtsmethode zu vertauschen und die Probleme zu erfassen. –

+0

Wow !! Danke vielmals!! genial!!! Kakaotics du schaukelst !! – user1010819

14

Eine gute Abhilfe von den Apple-Entwickler-Foren zu diesem Thema:

dieses

Sie:

[UIView setAnimationsEnabled:YES] 

und Animationen arbeiten beginnen wieder. Ich vermute, dass dies entweder ein direkter iOS7-Bug ist, oder irgendwo in meinem Code eine Animation oder UIViewController startet auf einem Hintergrund-Thread passiert, wodurch Animationen zu stoppen. Wahrscheinlich nicht verwandt mit der nicht näher spezifizierten zukünftigen Version von iOS.

+0

Fyi, auf unserer App sehen Animationen scheint gut zu funktionieren, fyi. Auch eine Frage hinzugefügt. Dachte, es ist eine gute Frage. – ort11

+1

Warum postest du als Antwort? das auch zwei Antworten? Bitte stelle das nach der Bearbeitung in Frage ... –

0

Dieses Problem scheint durch das Ausführen von UIKit-Dateien in Hintergrundthreads verursacht zu werden. Ich habe einen Pre-Render-Cache voll von NSOperationen, der komplexe UIViews zu UIImagages rendert, um die Ausgabe zwischenzuspeichern. Dies schien in iOS6 gut zu funktionieren, aber wahrscheinlich wird die Grenze etwas überschritten. Ich muss diese Funktionalität durch etwas ersetzen, das Bilder und Text in einen Grafikpuffer rendert, anstatt UIViews und UILabels überhaupt zu verwenden.

0

Alles, was Sie tun müssen, ist die Hauptwarteschlange Fang halten, während Antwort von einem API.Ios Hauptwarteschlange verwendet standardmäßig auf Empfang für die Aktualisierung von UI UI zu aktualisieren, aber es ist nicht zu 100 Prozent efficient.Hence Sie haben um sicherzustellen, dass die Benutzeroberfläche auf Hauptthread aktualisiert wird nur und die Art und Weise zu tun, ist wie folgt:

DispatchQueue.main.async{ 
    //UI related code eg: 
    self.label.text = "abc" 
    self.button.setTitle("xyz",.normal) 
    self.tableView.reloadData() 
} 

Wenn Sie nicht halten, Hauptthread Animationen fangen werden kann oder nicht. Aber wenn Sie Hauptthread Animationen verwenden, wird definitiv funktionieren.

richtiger Code während UI Aktualisierung auf api Antwort:

Alamofire.getApiCall(paramaters: parameters, completion:{ 
    response in 
    // UI related code. 
    DispatchQueue.main.async{ 
    self.label.text = "abc" 
    self.button.setTitle("xyz",.normal) 
    self.tableView.reloadData() 
    } 
}) 

falschen Code, die Animationen dazu führen kann, seltsame Abstürze zu stoppen und führen:

Alamofire.getApiCall(paramaters: parameters, completion:{ 
    response in 
    // UI related code. 
    self.label.text = "abc" 
    self.button.setTitle("xyz",.normal) 
    self.tableView.reloadData() 
}) 
Verwandte Themen