我有一個UIImageViews的NSArray,我想循環並快速換出「開」和「關」狀態。我在for循環中編寫了代碼,而不是在用戶點擊UIButton(按鈕的操作)時調用的方法。在一個循環中交換UIImageView圖像
這裏是一個循環:
for(int i = 0; i < [Images count]; i++) {
if(i > 0){
[self toggleImageViewOff:[Images objectAtIndex:i - 1]];
}
[self toggleImageViewOn:[Images objectAtIndex:i]];
[NSThread sleepForTimeInterval:0.5f];
}
如我所料,我只看到過在「開」狀態的最後的UIImageView用戶界面未更新。我認爲視圖的繪圖更新必須發生在這個代碼也在執行的主線程中。所以我瞭解了performSelectorInBackground:withObject:。使用此方法執行toggleImageViewOn/Off方法使循環正常工作。問題是,如果我讓睡眠間隔太短,我可以在「關閉」之後進行「開啓」更新,而線程操作不按順序。
所以我有一個明智的想法,將睡眠的整個循環移動到它自己的方法中,並使用performSelectorInBackground:withObject:從action方法調用它。我試過了,我回到沒有得到更新的視圖,直到循環結束。
這是一個長篇大論辦法讓我的問題:
什麼是動畫這保證開/關代碼火災的正確順序,並仍然得到視圖更新,即使在高速行駛的最佳方式是什麼? (即非常快速地循環)
我試圖考慮如何使用CoreAnimation來做到這一點,但我似乎無法讓我的頭在如何做到這一點。
對於獎金,這裏的切換方法:
- (void)toggleImageViewOn:(UIImageView *)theImageView {
[theImageView setImage:[UIImage imageNamed:@"on.png"]];
}
- (void)toggleImageViewOff:(UIImageView *)theImageView {
[theImageView setImage:[UIImage imageNamed:@"off.png"]];
}
比爾合理的食譜, 我試圖與周圍循環 [UIView的beginAnimations:@ 「動畫」 上下文:無]。 and [UIView commitAnimations]; 但它沒有效果。我看到的僅僅是循環過程中的一個巨大的停頓,然後「砰」的一聲,只是最後一個圖像是「開」。 – 2009-02-05 20:32:34
hm,imageview不能動畫其'圖像'屬性,我猜想,無賴。您可以考慮在此處使用圖層,因爲它們會對內容中的更改進行動畫製作(默認情況下爲交叉淡入淡出效果)。或者你可以做'推薦'視圖的東西,並添加一個'superview',它可以包含開啓或關閉的圖像視圖 – 2009-02-05 20:43:26
很酷的Bill Dudney現在在這裏。歡迎登上我真的很喜歡你關於iPhone dev的書。 – 2009-02-05 21:54:28