2010-07-13 12 views
36

Ho collegato i due metodi seguenti per separare i pulsanti nell'interfaccia utente, ma ho notato che dopo aver premuto il pulsante "VERSION 1" non sono riuscito a premere nuovamente il pulsante finché la durata dell'animazione all'interno del metodo non era terminata. La mia comprensione era che l'animazione utilizza il proprio thread in modo da non bloccare l'applicazione principale.fa animateWithDuration: animazioni: blocco thread principale?

// VERSION 1 
-(IBAction)fadeUsingBlock { 
    NSLog(@"V1: Clicked ..."); 
    [myLabel setAlpha:1.0]; 
    [UIView animateWithDuration:1.5 animations:^{ 
     [myLabel setAlpha:0.0]; 
    }]; 
} 

La versione più vecchio stile (sotto) non consentono il pulsante per essere repressa prima che il timer di animazione si conclude, è sufficiente resettare il timer per ricominciare. Se entrambi funzionano allo stesso modo, mi manchi qualcosa o c'è stato un cambio operativo tra il 3.2 e il 4?

// VERSION 2 
-(IBAction)fadeUsingOld { 
    NSLog(@"V2: Clicked ..."); 
    [myLabel setAlpha:1.0]; 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:1.5]; 
    [myLabel setAlpha:0.0]; 
    [UIView commitAnimations]; 
} 

Acclamazioni Gary

risposta

86

L'animazione con blocchi non blocca la filettatura principale. Penso che il comportamento che stai vedendo sia dovuto al fatto che, per impostazione predefinita, l'interazione dell'utente è disabilitata con le nuove chiamate di blocco. È possibile ignorare questa passando UIViewAnimationOptionAllowUserInteraction (chiamando animationWithDuration:delay:options:animations:completion), in questo modo:

-(IBAction) fadeUsingBlock { 
    NSLog(@"V1: Clicked ..."); 
    [myLabel setAlpha:1.0]; 
    [UIView animateWithDuration:1.5 
          delay:0 
         options:UIViewAnimationOptionAllowUserInteraction 
        animations:^{ 
         [myLabel setAlpha:0.0]; 
        } 
        completion:nil]; 
} 
+2

Ah che abbia un senso, che avevo perso questa opzione nella documentazione, guarderò in su. Molte grazie, molto apprezzato. – fuzzygoat

+1

Grazie per questo. Accidenti, questo mi stava infastidendo. In realtà è abbastanza fastidioso che non sia attivo di default, perché dice che blocca l'interazione con la vista animata, ma in realtà blocca l'intera interfaccia utente! – runmad

+0

Uomo, non sarebbe bello se questo fosse stato risolto nel prossimo iOS 5.0 ...

1

Per animateWithDuration :, il riferimento di classe non dice nulla di threading, quindi non sono sicuro.

Per beginAnimations:context: and commitAnimation:, sì, corrono in un thread separato UIView class Reference.

Alcune delle modifiche alle proprietà per visualizzare gli oggetti possono essere animate, ad esempio impostando frame, limiti, centro e proprietà di trasformazione. Se si modificano queste proprietà in un blocco di animazione, le modifiche dallo stato corrente al nuovo stato vengono animate. Richiamare il metodo beginAnimations: context: class per iniziare un blocco di animazione, impostare le proprietà che si desidera animare e quindi richiamare il metodo della classe commitAnimations per terminare un blocco di animazione. Le animazioni vengono eseguite in un thread separato e iniziano quando l'applicazione torna al ciclo di esecuzione. Altri metodi di classe di animazione consentono di controllare l'ora di inizio, la durata, il ritardo e la curva delle animazioni all'interno del blocco.

Problemi correlati