2010-07-13 81 views
36

我已經連接了下面兩種方法來分離我的UI中的按鈕,但注意到在按下「VERSION 1」按鈕之後,我無法再次按下按鈕,直到方法內的動畫持續時間結束。我的理解是,動畫使用自己的線程,以免阻塞主應用程序。做animateWithDuration:動畫:塊主線程?

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

的老式版本(下圖)確實允許動畫計時器結束前,簡單地重置計時器再次啓動按鈕被壓抑。如果這兩者的工作原理相同,我是否錯過了某些東西,或者在3.2和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]; 
} 

乾杯加里

回答

86

使用塊進行動畫製作不會阻止主線程。我認爲你看到的行爲是因爲,默認情況下,用戶交互是使用新的塊調用禁用持續時間動畫。你可以通過UIViewAnimationOptionAllowUserInteraction(主叫animationWithDuration:delay:options:animations:completion),這樣的重寫此:

-(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

啊是有道理的,我已經錯過了在該文檔中該選項,我會看它。非常感謝,非常感謝。 – fuzzygoat 2010-07-13 18:42:28

+1

謝謝你。該死的,這是在擾亂我。實際上它很煩人,它默認情況下不會啓用,因爲它確實會阻止與正在動畫的視圖進行交互,但實際上它會阻止整個UI! – runmad 2011-04-14 03:48:46

+0

男人,如果這是在即將到來的iOS 5.0中修復的話,會不會很好... 2011-08-12 22:31:41

1

對於animateWithDuration :,類引用不說的線程什麼,所以我不知道。

對於beginAnimations:context: and commitAnimation:,是的,他們運行在一個單獨的線程 UIView class Reference

對視圖對象的某些屬性更改可以進行動畫設置,例如設置框架,邊界,中心和變換屬性。如果您在動畫塊中更改這些屬性,則會從當前狀態變爲新狀態。調用beginAnimations:context:類方法來開始動畫塊,設置要設置動畫的屬性,然後調用commitAnimations類方法結束動畫塊。動畫在單獨的線程中運行,並在應用程序返回到運行循環時開始。其他動畫類方法允許您控制塊內動畫的開始時間,持續時間,延遲和曲線。