2014-02-12 78 views
0

我有一個ImageView,連接正確等。我顯示一個開始圖像,調用一個處理它的方法,並用新圖像更新ImageView,並重復執行幾次。如何確保圖像序列實際顯示在ImageView上?

所以:

self.imageView.image = [UIImage imageNamed:"@startImage"]; 
// some code 
self.imageView.image = [self.imageManipulator grayScaleImage:self.imageView.image]; 
// some code 
self.imageView.image = [self.imageManipulator adjustContrast:self.imageView.image]; 
// etc 

現在每個方法被調用與正確的圖像(即一個從以前的方法返回),但我的問題是,只有在最終圖像結束實際顯示後,所有的算法都有完了。

如何讓每個方法返回後,中間圖像就像我試圖做的那樣?

回答

1

問題是您沒有給系統顯示圖像的機會。會發生什麼是:

您安裝第一個圖像。

您安裝第二張圖片。

您安裝第三張圖像。

您的代碼返回,系統訪問事件循環,第三個圖像實際顯示在屏幕上。其他圖像根本不顯示。

你可以做的是使用延遲執行的方法,如performSelector:withObject:afterDelay。說這樣的:

//Install the first image into the image view. 
UIImage *firstImage = [UIImage imageNamed:"@startImage"]; 
self.imageView.image = firstImage; 


//After a brief delay (.1 seconds) install the second image into the image view 
UIImage *secondImage = [self.imageManipulator grayScaleImage: firstImage]; 
[self.imageView performSelector: @selector(setImage:) withObject: secondImage afterDelay: .1]; 

//After an additional .1 seconds of delay (.2 seconds total) install the 3rd image 
UIImage *thirdImage = [self.imageManipulator adjustContrast: secondImage]; 
[self.imageView performSelector: @selector(setImage:) withObject: thirdImage afterDelay: .2]; 
+0

這基本上是我想要的答案,但我稍微修改它。我不做延遲,而是在後臺執行計算並在主循環中更新圖像。那有performSelectorOnMainThread:(sel)waitUntilDone:YES。所以我可以等到圖像安裝後再進入我的下一個計算。完美的作品! – Alex

0

在運行循環的一個循環中,image屬性的值會多次更改。在完成所有更改之後,屏幕不會重新繪製。在UIImageView重新繪製時,image屬性的值是其設置的最後一個UIImage

2

如果您連續執行這三條語句而沒有給出主運行循環一次機會,UI將永遠不會更新,因此您只會看到最終映像。你必須給運行循環一個運行的機會。用定時器延遲每個語句,或者將這些圖像更改作爲操作添加到NSOperationQueue。 (可能有其他解決方案更適合取決於「//某些代碼」是什麼)

相關問題