Ich habe einen Bar-Stil NSProgressIndicator
in einer Unteransicht einer Ansicht mit Ebenenrückseite. Sein Verhalten ist etwas kompliziert, aber an bestimmten Punkten wird er als unbestimmter Fortschrittsanzeiger in Form eines Balkens angezeigt. Das Problem ist, wenn in diesem Zustand, es nicht animieren (dh wirbeln die Barbier Stange). Das Ausschalten der Ebenenunterstützung behebt das Problem, aber das macht andere Animationen des Fensters weniger glatt, also hoffe ich auf etwas Besseres.
Hier ist das vollständige Verhalten: Wenn ein Dirty Flag gesetzt wird, sollte es als unbestimmter, animierter Fortschrittsindikator sichtbar werden; dann, nach einer kurzen Verzögerung (um sicherzustellen, dass der Benutzer mit dem Tippen fertig ist), verwandelt es sich in einen bestimmten Fortschrittsindikator und füllt sich, während verschiedene Operationen ausgeführt werden; und schließlich, am Ende des gesamten Prozesses, versteckt es sich wieder.
Um dies zu realisieren, habe ich die folgenden Bindungen eingerichtet:
- Versteckt ist an mein Modell gebunden
loading
Eigenschaft mit einerNSNegateBoolean
Werttransformator. - Ist unbestimmt ist an mein Modell gebunden
waitingForInput
Eigentum. - Wert ist an mein Modell gebunden
currentProgress
Eigenschaft (die 0 ist, wennwaitingForInput
wahr ist). - Maximaler Wert ist an mein Modell gebunden
maximumProgress
Eigenschaft (die 0 ist, wennwaitingForInput
wahr ist).
Das funktioniert meistens, aber mit einer Ausnahme: Wenn waitingForInput
es YES
und somit die Fortschrittsanzeige unbestimmt ist, wird die Fortschrittsanzeige nicht animiert.
Der übliche Grund dafür, dass eine Fortschrittsanzeige nicht aktualisiert wird, ist, dass der Programmierer die Ablaufschleife mit einer lang andauernden Operation blockiert, aber das tue ich nicht: Während des fraglichen Zeitraums ist die Ablaufschleife völlig offen, und nur ein Timer wartet auf den Start. Soweit ich weiß, befindet sie sich auch nicht in einem merkwürdigen Modus. Die Anwendung akzeptiert während dieser Zeit ohne Probleme Tastatureingaben und andere Ereignisse. (Die spätere Phase, in der sich eine bestimmte Fortschrittsanzeige füllt, wird von einem asynchronen NSURLConnection
Es wird also auch nicht blockiert).
Ich habe mehrere Schritte unternommen, um dieses Problem zu beheben:
- Ich habe versucht, die Einstellung Animieren Bindung des Fortschrittsindikators an das Modell
waitingForInput
Eigenschaft, wie Ist unbestimmt . Dies führt dazu, dass die Animation ruckartig aktualisiert wird, wenn Änderungsbenachrichtigungen aufwaitingForInput
(waitingForInput
jedes Mal KVO-Benachrichtigungen sendet, wenn die Eingabeverzögerung neu startet), aber ich hoffe auf eine viel flüssigere Animation als das. - Ich habe versucht, mit Hilfe von KVO die Änderungen an beiden
loading
ywaitingForInput
. Wenn eine Änderung beobachtet wird, ruft es die Fortschrittsanzeige-startAnimation:
y-stopAnimation:
Methoden nach Bedarf. Diese haben keine offensichtlichen Auswirkungen. - Ich habe versucht, die Einstellung
usesThreadedAnimation
auf den Fortschrittsindikator zuNO
. (Ein Google-Treffer deutete darauf hin, dass dies bei Aktualisierungsproblemen von Fortschrittsindikatoren auf Ebenen helfen könnte). Dies hat keine offensichtliche Wirkung. Ich habe auch versuchtYES
nur so zum Spaß, was sich als ebenso sinnlos erwies.
Schließlich habe ich auch versucht, die Ebenenunterstützung zu deaktivieren. Dies behebt das Problem in Kombination mit der Animate-Bindung. Allerdings verschlechtert es die Leistung anderer Animationen inakzeptabel, so dass ich es vorziehen würde, dies zu vermeiden.
Also, hat jemand eine Idee? Ich wäre wirklich dankbar für etwas Hilfe bei diesem Problem!