2014-05-22 4 views
12

Ich möchte meine UIProgressView Progression von 0 auf 1 während 10 Sekunden animieren.UIView animateWithDuration und UIProgressView setProgress

Code:

[UIView animateWithDuration:10.0 animations:^{ 
    [_myProgressView setProgress:1 animated:YES]; 
} completion:(BOOL finished)^{ 
    if (finished) NSLog(@"animation finished); 
}]; 

-Animation funktioniert gut, außer dass Abschluss und NSLog werden immer sofort aufgerufen.

Ich versuchte animateWithDuration: withDelay:, aber die Verzögerung wird nicht respektiert und sofort ausgeführt.

Hat jemand das gleiche Problem festgestellt?

Danke für Ihre Hilfe.

+1

Ich hatte auch das gleiche Problem und ich muss noch eine Lösung finden, die den Fortschritt auf eine gute Art und Weise belebt. Haben Sie eine nicht nacheilende Lösung gefunden? – EmilDo

+0

Das Gleiche gilt für Emilio. Haben Sie eine gute Lösung – osrl

+0

http: // seanallen.co/posts/animated-progress-bar – iDev750

Antwort

0

Was ich herausgefunden habe, ist eine Reihe von sowohl UIview-Animationen und Fortschrittsanzeige-Animationen, die viel netter arbeiten und die Fortschrittsanzeige reibungslos animieren. Wenn Sie nur die Kombination aus Animation und Fortschrittsanimation verwenden, wird diese direkt ohne Berücksichtigung des UIview-Animationstimers ausgelöst.

-(void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    timer = [NSTimer scheduledTimerWithTimeInterval: 1.0f 
              target: self 
              selector: @selector(updateTimer) 
              userInfo: nil 
              repeats: YES]; 
} 


- (void)updateTimer 
{ 
    if (progressView.progress >= 1.0) { 
     [timer invalidate]; 
    } 
    [UIView animateWithDuration:1 animations:^{ 
     float newProgress = [self.progressView progress] + 0.125; 
     [self.progressView setProgress:newProgress animated:YES]; 
    }]; 
} 

Fühlen Sie sich frei die Animationszeiten anpassen, um noch besser und weiche Übergänge

+0

gutes Beispiel für die Verwendung in Prototyp-App –

1

Es ist eine alte Frage, aber ich hatte ein ähnliches Problem und hier ist meine Lösung (sorry es in Swift ist). Der Fertigstellungsteil wird aufgerufen, wenn die Animation beendet ist. Es befindet sich in einer benutzerdefinierten UIProgressView-Klasse.

override func setProgress(progress: Float, animated: Bool) { 

    self.progress = progress 
    if animated { 
     let duration: NSTimeInterval = 10.0 
     UIView.animateWithDuration(duration, delay: 0.0, options: UIViewAnimationOptions.CurveLinear, animations: { 
      self.layoutIfNeeded() 
      }, completion: { (completed) in 
       self.animationDuration = nil 
     }) 
    } else { 
     self.layoutIfNeeded() 
    } 
} 
3

machen es einfach NSTimer anstatt mit wie,

[progressview setProgress:0 animated:NO]; 
NSTimer *t=[NSTimer scheduledTimerWithTimeInterval: 1.0f 
             target: self 
             selector: @selector(progressupdate) 
             userInfo: nil 
             repeats: YES]; 

unter der Funktion, die den Fortschritt aktualisiert ist,

-(void)progressupdate{ 
    if(progressview.progress<1){ 
     [progressview setProgress:(progressview.progress+=0.2) animated:YES]; 
    } 
    else{ 
     [t invalidate]; 
    } 
} 

Hope it ....

21

Es ist ein hilft altes Problem, aber ich schreibe immer noch die Lösung hier. Die Lösung erwies sich als sehr einfach. Alles, was Sie tun müssen, ist:

[_myProgressView setProgress:1]; 
[UIView animateWithDuration:10.0 animations:^{ 
    [_myProgressView layoutIfNeeded]; 
} completion:^(BOOL finished){ 
    if (finished) NSLog(@"animation finished"); 
}]; 

Hier ist eine gute Erklärung dafür ist, warum die Dinge nicht richtig arbeiten für Sie: http://blog.spacemanlabs.com/2012/08/premature-completion-an-embarrassing-problem/

So können Sie nicht setProgress:animated: Methode verwenden, um die Fortschritte im Hinblick auf animieren und erhalten Sie Ihre gewünschtes Verhalten von completion Block auch. Die Einstellung progress innerhalb des Blocks wird jedoch nicht animiert, da progress keine animierbare Eigenschaft ist.

Siehe Apple-Dokumentation, die sagen, dass seine erforderlich, dass die Eigenschaft animierbaren sein: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/#//apple_ref/occ/clm/UIView/animateWithDuration:animations:

So aktualisieren Sie einfach den Wert von progress Eigenschaft außerhalb des belebten Block und tun das Layout des Blicks in dem beseelten Block .

+1

Dies sollte die richtige Antwort markiert werden. – MrBr

+0

sehr schön. In diesem Fall möchten Sie wahrscheinlich die lineare Zeitkurve verwenden '[UIView animateWithDuration: 10.0 Verzögerung: 0 Optionen: UIViewAnimationOptionCurveLinear Animationen:^{' – CupawnTae

+0

Richtige Antwort, Animation einer Animation mit 'UIView.animate (:)' ist falsch und setzt die Animationsschicht am Ende nicht zurück. –