2014-05-22 9 views
12

Desidero animare la mia progressione UIProgressView da 0 a 1 per 10 secondi.Uiview animateWithDuration e UIProgressView setProgress

Codice:

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

Animation sta lavorando bene, tranne che il completamento e NSLog sono sempre chiamati immediatamente.

Ho provato animateWithDuration: withDelay: ma il ritardo non viene rispettato ed eseguito immediatamente.

Qualcuno ha riscontrato lo stesso problema?

Grazie per il vostro aiuto.

+1

Ho anche affrontato lo stesso problema e devo ancora trovare una soluzione che animi i progressi in un buon modo. Hai trovato qualche soluzione non in ritardo? – EmilDo

+0

Lo stesso con Emilio. Hai una buona soluzione – osrl

+0

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

risposta

0

Quello che ho scoperto è un insieme di animazioni di UIview e animazioni di visualizzazione progresso che funzionano molto meglio e animano la progressview senza intoppi. Se si utilizza solo la combinazione dell'animazione e dell'animazione progressview, essa viene attivata direttamente indipendentemente dal timer di animazione di UIview.

-(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]; 
    }]; 
} 

Sentitevi liberi di regolare i tempi di animazione per ancora meglio e transizioni fluide

+0

buon esempio per l'utilizzo nell'app prototipo –

1

E 'una vecchia questione, ma ho avuto un problema simile e qui è la mia soluzione (mi dispiace è a Swift). La parte di completamento viene chiamata al termine dell'animazione. È all'interno di una classe UIProgressView personalizzata.

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

Ne fanno invece semplice utilizzando NSTimer come,

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

Di seguito è la funzione che aggiorna il progresso,

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

Speranza che aiuta ....

21

sua una vecchio problema ma sto ancora postando la soluzione qui. La soluzione si è rivelata molto semplice. Tutto quello che dovete fare è:

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

Ecco una buona spiegazione del motivo per cui le cose stavano lavorando in modo non corretto per voi: http://blog.spacemanlabs.com/2012/08/premature-completion-an-embarrassing-problem/

quindi non è possibile utilizzare setProgress:animated: metodo per animare la vista progressi e ottenere la vostra comportamento desiderato del blocco completion. Tuttavia, l'impostazione di progress all'interno del blocco non la animerà, poiché progress non è una proprietà animabile.

Fare riferimento alla documentazione di Apple, che afferma che il suo necessario per la proprietà di essere animatable: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/#//apple_ref/occ/clm/UIView/animateWithDuration:animations:

Quindi basta aggiornare il valore della progress proprietà al di fuori del blocco di animare e fare il layout della vista all'interno del blocco animato .

+1

Questa dovrebbe essere contrassegnata come risposta corretta. – MrBr

+0

molto bello. Per questo caso, probabilmente vorresti usare la curva di temporizzazione lineare '[UIView animateWithDuration: 10.0 delay: 0 opzioni: UIViewAnimationOptionCurveLinear animazioni:^{' – CupawnTae

+0

Risposta corretta, animare un'animazione usando 'UIView.animate (:)' è sbagliato e non resetta il livello dell'animazione alla fine. –