Swift - UIProgressView ist nicht glatt mit NSTimer

8

Ich verwende also einen NSTimer, um den Benutzer wissen zu lassen, dass die App funktioniert. Der Fortschrittsbalken ist auf 3 Sekunden eingestellt, aber wenn er ausgeführt wird, wird er in einer 'tickenden' Bewegung angezeigt und es ist nicht so glatt wie es sein sollte. Gibt es trotzdem, ich kann es ruhiger machen - ich bin sicher nur ein Rechenfehler meinerseits ....

Wenn jemand einen Blick werfen könnte, wäre das großartig. Hier ist der Code:

%Vor%     
dwinnbrown 15.07.2015, 18:29
quelle

4 Antworten

18

Bearbeiten: Eine einfache UIView-Animation von 3 Sekunden (empfohlen)

Wenn sich Ihr Balken gerade bewegt, um Aktivität anzuzeigen, sollten Sie möglicherweise eine UIActivityIndicatorView oder eine benutzerdefinierte UIView-Animation verwenden:

%Vor%

Stellen Sie sicher, dass der Fortschritt Ihrer progressView zu Beginn auf Null gesetzt ist. Dies wird zu einer glatten 3 Sekunden Animation des Fortschritts führen.

Einfacher animierter Fortschritt (Works springt aber trotzdem ein bisschen)

Ссылка :

%Vor%

Option mit kleineren Intervallen. (Nicht empfohlen)

Stellen Sie Ihren Timer auf ein kleineres Intervall ein:

%Vor%

Aktualisieren Sie dann Ihre Funktion

%Vor%     
mbottone 15.07.2015, 18:34
quelle
2

Was ist mit der richtigen Methode zum Animieren von Änderungen? animateWithDuration: Animationen: oder CABasicAnimation . Sie können damit glatte Animationen erstellen.

    
Pr0Ger 15.07.2015 19:12
quelle
1

Es ist schwer zu sagen, was genau das Problem ist. Ich möchte die Ausgabe sehen, wenn Sie eine Druckzeile in setProgress setzen, um einen Zeitstempel zu drucken. Schiesst es tatsächlich jede Zehntelsekunde? Meine Vermutung ist, dass es nicht ist.

Warum nicht? Nun, der Timer plant einen Lauf-Loop-Task im Haupt-Thread, um den Code in setProgress auszuführen. Diese Aufgabe kann erst ausgeführt werden, wenn Aufgaben in der Warteschlange ausgeführt werden. Wenn also lange laufende Aufgaben in Ihrem Hauptthread stattfinden, wird Ihr Timer sehr ungenau ausgelöst. Mein erster Vorschlag ist, dass dies vielleicht passiert.

Hier ist ein Beispiel:

  1. Sie starten einen Timer, um jede Sekunde etwas zu tun.
  2. Unmittelbar danach starten Sie eine lange laufende Hauptthread-Aufgabe (zum Beispiel versuchen Sie, eine Tonne Daten in eine Datei zu schreiben). Diese Aufgabe dauert fünf Sekunden.
  3. Ihr Timer möchte nach einer Sekunde feuern, aber Ihre Datei wird geschrieben Den Hauptfaden für die nächsten vier Sekunden in der Hand halten, damit der Timer nicht zünden kann für weitere vier Sekunden.

Wenn dies der Fall ist, müssen Sie das Hauptthread entweder in einen Hintergrundthread verschieben oder einen Weg finden, um das Problem zu lösen, während Sie regelmäßig zur Ausführungsschleife zurückkehren. Zum Beispiel können Sie während Ihrer lang laufenden Hauptthread-Operation regelmäßig runUntilDate in Ihrer Ausführungsschleife, damit andere Schleifenaufgaben ausgeführt werden können.

Beachten Sie, dass Sie die Füllung des Fortschrittsbalkens während des Haupttask-Tasks nicht ständig erhöhen konnten, da der Fortschrittsbalken seine Füllung erst dann tatsächlich animiert, wenn Sie zur Ausführungsschleife zurückkehren.

    
Aurast 15.07.2015 18:51
quelle
0

Für fortfahren loader

%Vor%

und

%Vor%     
Krishna Kirana 22.01.2018 18:02
quelle

Tags und Links