2014-02-28 132 views
1

我正在iPhone上用下面的遞歸函數運行一個動畫。當我設置動畫時,用戶交互被阻止(並且動畫完成時,用戶交互工作)。我一直在嘗試啓用用戶交互,並嘗試過UIView animateWithDuration和用戶交互

  • 將標誌UIViewAnimationOptionAllowUserInteraction傳遞到animateWithDuration
  • 定義了從this website起稱爲touchesBegan的功能。此功能從未被調用(並在我點擊屏幕時在其他視圖中調用)。
  • 在另一個線程上運行動畫dispatch_asyncdispatch_syncthis 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]; 

回答

2

要調用從主線程兩個塊(塊和uiBlock)。如果longAndComplicatedCalculation阻塞線程,則行爲是正常的。您應該在一個單獨的線程中調用您的計算,並在完成調用UIThread以啓動動畫之後從那裏調用。

爲了使它更清楚,這是我會做(無需您的具體實現和測試)的方式:

考慮你的形象被聲明爲屬性:

@property (nonatomic, retain) UIImage *changedImage; 

當你調用動畫,你可以不喜歡它

[NSThread detachNewThreadSelector:@selector(updateImage) toTarget:nil withObject:nil]; 

,並在功能你做的計算和事後呼籲UIThread動畫:

- (void)updateImage { 
    self.changedImage = [self longAndComplicatedCalculation]; 
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
     [self doAnimationAndChangeImage]; 
    }]; 
} 

我希望這會有所幫助。

+0

這個答案雖然有點模糊,但是正確的。這聽起來像是阻止用戶界面的動畫:它是阻止整個主線程的計算。而且必須做些什麼,因爲如果你阻塞主線程足夠長的時間,你的應用程序將被WatchDog進程立即殺死。 – matt

+0

我已經嘗試在後臺線程上拋出計算,但遇到了在主線程中分配self.imageView.image的問題。我也不確定animateWithDuration如何與dispatch_async一起使用。你能提供一個例子嗎? – Scott

相關問題