2012-09-12 41 views
2

當iOS編程,我經常發現自己面臨着以下情況:iOS方法調用動畫,完成時執行操作?

- (void)someMethod 
{ 
    [self performSomeAnimation]; 

    //below is an action I want to perform, but I want to perform it AFTER the animation 
    [self someAction]; 
} 

- (void)performSomeAnimation 
{ 
    [UIView animateWithDuration:.5 animations:^ 
    { 
     //some animation here 
    }]; 
} 

面對這種情況,我通常最終只是複製/粘貼我的動畫代碼,這樣我就可以使用完成塊處理,像這樣:

- (void)someMethod 
{ 
    [self performSomeAnimation]; 


    //copy pasted animation... bleh 
    [UIView animateWithDuration:.5 animations:^ 
    { 
     //same animation here... code duplication, bad. 
    } 
    completion^(BOOL finished) 
    { 
     [self someAction]; 
    }]; 
} 

- (void)performSomeAnimation 
{ 
    [UIView animateWithDuration:.5 animations:^ 
    { 
     //some animation here 
    }]; 
} 

解決此問題的正確方法是什麼?我是否應該將一塊代碼傳遞給我的-(void)performSomeAction方法,如下所示,並在完成動畫時執行該塊?

- (void)someMethod 
{ 
    block_t animationCompletionBlock^{ 
     [self someAction]; 
    }; 

    [self performSomeAnimation:animationCompletionBlock]; 
} 

- (void)performSomeAnimation:(block_t)animationCompletionBlock 
{ 
    [UIView animateWithDuration:.5 animations:^ 
    { 
     //some animation here 
    } 
    completion^(BOOL finished) 
    { 
     animationCompletionBlock(); 
    }]; 
} 

難道是解決這個問題的正確方法嗎?我想我一直在避免它,因爲我不熟悉塊的使用(甚至不確定是否正確地聲明瞭該塊),並且它似乎是一個簡單問題的複雜解決方案。

+0

你說的動畫總是相同的,但完成變化?如果是這樣,你的解決方案對我來說看起來很不錯。 –

+0

我認爲我的語法不正確。我只是看着它,我應該像這樣聲明我的塊:void(^ myBlock)(void),但是我的方法聲明看起來像什麼? - (void)performSomeAnimation :(無效)(^ myBlock)(void)似乎沒有工作(我敢肯定我正在屠殺語法哈哈) – MikeS

回答

1

你也可以這樣做:

- (void)performSomeAnimationWithCompletion:(void(^)(void))animationCompletionBlock 
{ 
    [UIView animateWithDuration:.5 animations:^ 
    { 
     //some animation here 
    } 
    completion^(BOOL finished) 
    { 
     animationCompletionBlock(); 
    }]; 
} 

而不是明確地定義一個塊,將它作爲參數,可以直接調用它(這是塊動畫如何爲UIView的工作,例如) :

- (void)someMethod 
{ 
    [self performSomeAnimationWithCompletion:^{ 

     [self someAction]; 

    }]; 
} 
+0

嗯沒關係。這可能比嘗試創建塊並使用我嘗試的方法傳遞它更好。由於某種原因,它看起來更清潔並且感覺更自然。 – MikeS

+0

是的,它有點乾淨。對於這些東西塊真的很有幫助。不要害怕使用它們! – jere

+0

已將此代碼添加到我的代碼中,並且一切似乎都正常。謝謝! (:) – MikeS

0

從我能理解,似乎你已經非常有答案,你只需要刪除對performSomeOperation第一個電話:

- (void)someMethod 

{

[UIView animateWithDuration:.5 animations:^ 
{ 
    //Your animation block here 
} 
completion: ^(BOOL finished) 
{ 
    //Your completion block here 
    [self someAction]; 
}]; 

}

+0

那麼,這個問題(因爲喬希比我更優雅地說)是我有一個動畫我執行總是一樣的,但完成塊不斷變化,所以我需要一種方式來傳遞一個完成塊,以免不斷重複我的動畫代碼。 – MikeS

相關問題