2013-04-02 51 views
1

我使用這個移動我的形象:setNeedsDisplay混亂

meteorDisplayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(moveImage:)]; 

這裏是我的moveImage:方法:

-(void) moveImage:(CADisplayLink *)sender{ 
    CGPoint img; 
    imgLocation = imgImageView.center; 
    if (img < 100) { 
     img.y++; 
    } 
    else{ 
     imgLocation.y = 0; 
    } 
    imgImageView.center = imgLocation;  
} 

這在屏幕上更新我的圖像的位置不管是什麼。爲什麼setNeedsDisplay在這裏沒有效果? setNeedsDisplay有什麼意義?

+0

這是一種方法,而不是一種功能。 – matt

+1

代碼中沒有'setNeedsDisplay'。 – matt

+0

setNeedsDisplay應該是在imgImageView.center = imgLocation之後;我在玩它的時候拿出來了。但是,在那裏我說我刪除了它。謝謝! – mskw

回答

3

我假設imgImageViewUIImageView的一個實例。如果它是而不是UIImageView的實例,請編輯您的問題以告訴我們它是什麼。

更改視圖的center屬性絕不會要求您的應用重新繪製視圖。顯示服務器(這是一個單獨的進程,在iOS 6中爲backboardd,在早期版本中爲springboard)已經有視圖像素數據的副本。當您更改視圖的center時,該視圖只是通知顯示服務器其新位置,並且顯示服務器將視圖的像素數據複製到屏幕的相應部分。

因此,更改視圖的center屬性永遠不會要求您發送setNeedsDisplay

更具體地說,UIImageView甚至沒有實施drawRect:。相反,當您設置其圖像時,UIImageView只是將其圖像的像素數據發送到顯示服務器。所以即使你發送setNeedsDisplayUIImageView,它仍然不會運行任何drawRect:方法。

順便說一句,你可以在自己的UIView子就此別過,通過設置self.layer.contentsCGImageRef代替實施drawRect:。您需要#import <QuartzCore/QuartzCore.h>才能做到這一點。當然,UIImageView也會處理動畫和可調整大小的圖像。

+1

非常有趣,我不知道這一切。 +1 – borrrden

+0

是的,我對此並不瞭解。 – mskw

1

設置影響對象佈局的屬性時,將在內部調用setNeedsDisplay。你需要自己調用自定義屬性等,不自動調用它。

1

setNeedsDisplay僅適用於圖層或視圖的內容。也就是說,如果視圖的內容已經改變並且需要重新繪製,你可以使用setNeedsDisplay來告訴視圖需要重繪,並且會觸發它的drawRect方法。

視圖變換(如位置,縮放和旋轉等)由GPU直接處理,不需要重繪視圖;因此,當您只是移動或轉換視圖時,setNeedsDisplay不適用。