2013-05-15 14 views
8

Ho un set di animazioni di UIImageView che rappresentano un valore corrente e continuano a scorrere in alto ... idealmente non si fermano mai, anche nella vista è una scrollView o a quando sto scorrendo o zoomando nella scrollView, l'animazione si interrompe e si riavvia quando scrollView si arresta completamente. Credo che questo sia dovuto a un problema di threading dal momento che il ridisegno degli elementi avviene sul thread principale. All'inizio ho provato l'animazione UIView e quindi anche l'animazione core senza alcun effetto ... C'è un modo per avere la mia torta e mangiarla anch'essa?UIScrollView scroll block block Uiview animazione

ne e tutto l'aiuto sarebbe apprezzato

codice segue

- (void)TestJackpotAtRate:(double)rateOfchange 
{ 
    double roc = rateOfchange; 

    for (int i = 0; i < [_jackPotDigits count]; ++i) 
    { 
     roc = rateOfchange/(pow(10, i)); 

     UIImageView *jackpotDigit = [_jackPotDigits objectAtIndex:i]; 

     float foreveryNseconds = 1/roc; 

     NSDictionary *dict = @{@"interval"  : [NSNumber numberWithFloat:foreveryNseconds], 
          @"jackPotDigit" : jackpotDigit 
          }; 

     [NSTimer scheduledTimerWithTimeInterval:foreveryNseconds target:self selector:@selector(AscendDigit:) userInfo:dict repeats:YES]; 
    } 
} 

-(void)AscendDigit:(NSTimer*)timer 
{ 
    NSDictionary *dict = [timer userInfo]; 

    NSTimeInterval interval = [(NSNumber*)[dict objectForKey:@"interval"] floatValue]; 
    UIImageView *jackpotDigit = [dict objectForKey:@"jackPotDigit"]; 

    float duration = (interval < 1) ? interval : 1; 

    if (jackpotDigit.frame.origin.y < -230) 
    { 
     NSLog(@"hit"); 
     [timer invalidate]; 
     CGRect frame = jackpotDigit.frame; 
     frame.origin.y = 0; 
     [jackpotDigit setFrame:frame]; 

     [NSTimer scheduledTimerWithTimeInterval:interval target:self selector:@selector(AscendDigit:) userInfo:dict repeats:YES]; 
    } 

    [UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionAllowUserInteraction animations:^ 
    { 
     CGRect frame = [jackpotDigit frame]; 

     double yDisplacement = 25; 

     frame.origin.y -= yDisplacement; 

     [jackpotDigit setFrame:frame]; 

    } 
         completion:^(BOOL finished) 
    { 

    }]; 

} 
+1

Controllare questo thread SO http://stackoverflow.com/a/4136988/2315974 – danypata

+0

Grazie mille ... Proprio quello di cui avevo bisogno – Genhain

risposta

27

Come danypata rilevare nei miei commenti tramite questa discussione My custom UI elements are not being updated while UIScrollView is scrolled Ha qualcosa a che fare con il filo NSTimer piuttosto che il filo di animazione, o forse entrambi, se qualcuno può chiarire. In ogni caso durante lo scorrimento sembra che tutti gli eventi di scorrimento ottengano l'uso esclusivo del ciclo principale, la soluzione è quella di mettere il timer che si sta usando per fare la tua animazione nella stessa modalità di loop che è UITrackingLoopMode quindi anche usare il ciclo principale quando scrolling e ...

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:foreveryNseconds target:self selector:@selector(AscendDigit:) userInfo:dict repeats:YES]; 

[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 

Tada.

+1

C'è qualche discussione sulle modalità di loop di esecuzione con animazione di circa 30 minuti nel WWDC del 2012 video "Migliorare l'esperienza utente con le visualizzazioni di scorrimento". – Gerard

+0

Grazie mille, le mie animazioni ora funzionano perfettamente indipendentemente dall'interazione dell'utente :) – Supertecnoboff

+0

Grazie. Questo è quello che sto cercando. Mi hai salvato la giornata. – HPM