2010-08-19 57 views
0

一個經常回答的問題,恐怕但我在這方面非常黑暗。無法讓setNeedsDisplay在UIImageView的循環中工作

在我的視圖控制器我有以下方法切換回和總共5次

- (IBAction)cycle{ 

BOOL select1; 
select1=YES; 

UIImage *image1 = [UIImage imageNamed:@"image1.png"]; 
UIImage *image2 = [UIImage imageNamed:@"image2.png"]; 

for (int i=0; i<5; i++) { 

    if (select1){ 
    [imageview setImage:image1]; 
    } else { 
    [imageview setImage:image2]; 
    } 

    [NSThread sleepForTimeInterval:1.0]; 

    [imageview setNeedsDisplay]; 

} 
} 

的問題是,所述setNeedsDisplay消息不環路內工作的兩個圖像之間轉發和視圖是隻有在方法退出時才更新。

我能在這裏做什麼嗎?這種方法是可行的,還是我完全走錯了路。這是一個測試程序(我是這種語言的新手),但以編程方式控制此類應用程序會很有用。下一步的應用程序將實現圖片更改之間的隨機更改時間。

任何人都可以幫助我嗎?

回答

1

錯誤的軌道。調用

[NSThread sleepForTimeInterval:1.0]; 

只是試圖讓主線程睡着。問題是,這是實際進行繪圖的線程。你需要結束你正在做的事情,並給NS運行時控制bakc,以便它可以更新gui元素。

嘗試使用NSTimer創建計劃的計時器。讓它重複你想要的時間間隔。所有你然後要做的就是設置圖像:

if (select1){  
    [imageview setImage:image1];  
    } else {  
    [imageview setImage:image2];  
    } 

沒有必要

[imageview setNeedsDisplay]; 

由於ImageView的會處理,對於本身。

+0

它*稍微*比這更復雜。主線程執行「顯示」( - [CALayer顯示]或CALayerDelegate的-displayLayer)。當您返回到運行循環時,UIKit會調用CATransactionCommit()或其他東西,它會「顯示」所有圖層(將它們渲染到CALayer.content屬性中)。 CoreAnimation然後選擇變化,結果在CoreAnimation線程和GPU上合成。完成後,CoreAnimation會進行緩衝翻轉,並在屏幕上看到結果。很多緩衝處處! – 2010-08-20 00:06:33

+0

@tc:我的帽子給你。這是你在那裏的一個了不起的知識水平。我很嫉妒,我要去讀一些東西。 – 2010-08-20 00:14:58

+0

太棒了。現在所有的作品。這一切都是有道理的,並且已經學到了很多東西,例如關於NSTimer。 setNeedsDisplay確實是多餘的。非常感謝。 – drw 2010-08-20 22:14:54