1
我正在iPhone上用下面的遞歸函數運行一個動畫。當我設置動畫時,用戶交互被阻止(並且動畫完成時,用戶交互工作)。我一直在嘗試啓用用戶交互,並嘗試過UIView animateWithDuration和用戶交互
- 將標誌
UIViewAnimationOptionAllowUserInteraction
傳遞到animateWithDuration
。 - 定義了從this website起稱爲
touchesBegan
的功能。此功能從未被調用(並在我點擊屏幕時在其他視圖中調用)。 - 在另一個線程上運行動畫
dispatch_async
和dispatch_sync
如this SO answer指定。我已經嘗試了幾種方法,但我甚至不確定它是否可以工作。 - 放入一個UIButton來檢測水龍頭。它所鏈接的功能不需要1-2秒。
對於我來說,沒有啓用所有聽起來像用戶交互。這個動畫在運行時如何響應?
這個動畫相當長和複雜 - 這是這個應用程序存在的全部原因。每個longAndComplicatedCalculation
需要約1秒,這個功能被稱爲〜30次。
- (void)startAnimation:(dispatch_block_t)block withUIBlock:(dispatch_block_t)uiBlock iteration:(int)N{
[UIView animateWithDuration:1.0
delay:0.0
options:(UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionAllowAnimatedContent)
animations:^(void) {
[block invoke];
[uiBlock invoke];
}
completion:^(BOOL finished) {
if(FINISHED_IF && N<N_MAX) {
__weak id weakSelf = self;
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[weakSelf startAnimation:block withUIBlock:uiBlock iteration:N+1];
}];
}
}
];
}
該功能被稱爲與
[self startAnimation:^{
imageChange = [self longAndComplicatedCalculation];
} withUIBlock:^{
self.imageView.image = imageChange;
}
iteration:1];
這個答案雖然有點模糊,但是正確的。這聽起來像是阻止用戶界面的動畫:它是阻止整個主線程的計算。而且必須做些什麼,因爲如果你阻塞主線程足夠長的時間,你的應用程序將被WatchDog進程立即殺死。 – matt
我已經嘗試在後臺線程上拋出計算,但遇到了在主線程中分配self.imageView.image的問題。我也不確定animateWithDuration如何與dispatch_async一起使用。你能提供一個例子嗎? – Scott