NSProgressIndicator ständiges redrawing

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • NSProgressIndicator ständiges redrawing

    Hallo,

    ich verwende in meiner App einen Custom NSProgressIndicator auf einer Custom NSView.
    Bei aktvierter Core Animation wird nach dem durchlaufen des NSProgressIndicator andauernd die Methode -drawRect des Indikators aufgerufen.
    Dies führt zu erhöhten CPU Aktivität. Selbst wenn der Indikator versteckt wird (setHidden), wird -drawRect trotzdem aufgerufen.

    Bei deaktivierung des Core Animation Layers der Custom NSView entstehen Grafikfehler, aber dafür fällt das neu zeichnen (-drawRect) des Indikators bei versteckten Zustand (setHidden) weg.

    Wie kann man das neu Rendern trotz aktivierten Core Animation Layer verhindert. Oder die Grafikfehler ohne das nutzen des Core Animation Layer in den griff bekommen. Siehe dazu das angehängte Beispiel Programm.

    Ich habe schon einige Custom NSProgressIndicator aus dem Internet getestet, alle diese Beispiele weisen die selben Fehler, ständiges neu Rendern (mit Core Animation Layer) oder Grafikfehler (ohne Core Animation Layer), auf.

    Mit freundlichen Grūßen
    Jan
  • Wenn ich das richtig sehe, liegt das daran, dass ein Timer den selector "activateAnimation:" nach animation finish immer noch weiterhin aufruft und daher auch das View ständig neu gezeichnet wird… aber warum der Timer nicht beendet wird ist mir nicht ersichtlich auf die Schnelle.
  • Edit: Es gibt einige Probleme beim Projekt

    1.) In Zeile 32 von NewProgressBar.m:

    Der Timer leakt hier, es wird keine Referenz zum Objekt über die Instanzvariable "animator" hergestellt:

    Quellcode

    1. -(void)setAnimator:(NSTimer *)value {
    2. if (animator != value) {
    3. [animator invalidate];
    4. + animator = value;
    5. }
    6. }


    2.) Der Name der instanzvariable "animator" ist ungünstig gewählt, der proxy Animator in Cocoa heißt schon (id)animator.

    3.) Bevor der Pointer der Instanzvariable des Timers "animator" auf ein neues Objekt zeigt, muss der alte Timer ein [-NSTimer invalidate] bekommen, sonst wird er nicht von der RunLoop entfernt und läuft weiter.

    4.) Die Zeile 21 in NewProgressBar.m verhindert, dass am Ende stopAnimation: aufgerufen wird. Denn solange [self isDisplayedWhenStopped] true ist, wird die Animation nie enden.