2012-01-14 76 views
1

看起來在UIView上調用[self setNeedsDisplay]不會導致 [self.layer setNeedsDisplay]。它是正常的,如果我重寫setNeedsDisplay如下:UIView setNeedsDisplay調用CALayer的setNeedsDisplay?

- (void)setNeedsDisplay { 
    [super setNeedsDisplay]; 
    [self.layer setNeedsDisplay]; 
} 

這會不會給我惹麻煩?也許有更好的辦法? 謝謝

+0

你爲什麼認爲你需要這個? – 2012-01-14 22:24:39

+0

我想調用'[myView setNeedsDisplay]'方法,而不必調用'[myView.layer setNeedsDisplay]'。我在UIView子類中設置了一個精心製作的CALayer層次結構。 – Ana 2012-01-14 22:41:51

+0

爲什麼你需要調用'[CALayer setNeedsDisplay]'?調用'[UIView setNeedsDisplay]'會導致它在運行循環結束時觸發它的'-drawRect:'。你還想做什麼? – 2012-01-14 22:51:58

回答

1

我不明白爲什麼它會讓你陷入困境。 setNeedsDisplay/setNeedsLayout只是標記視圖/圖層需要顯示/佈局。它會在下次運行循環時執行繪圖。

雖然在視圖上調用它並不會導致它在圖層上發生,但我很驚訝,因爲畢竟UIView及其關聯的CALayer是非常緊密集成的。

因此,總體而言,如果您發現它不適合您,只需在視圖上撥打setNeedsDisplay即可獲得解決方案。我不明白它是如何傷害任何東西的。

+1

當drawRect:實現時(即使方法是空的並且什麼都不做),UIView只在其底層CALayer上調用setNeedsDisplay。這告訴UIView的setNeedsDisplay它的圖層也有一些繪圖要完成。另一種自動調用圖層的setNeedsDisplay的方法是將圖層的標誌needsDisplayOnBoundsChange設置爲true,只要視圖的邊界發生變化(會自動更改圖層的邊界),這會觸發setNeedsDisplay。但要回答你的問題,如果你不覆蓋drawRect,你所做的很好,否則它是多餘的。 – 2013-05-09 06:43:33

+0

Thanks @ Mr.T,您的評論回答了我的問題。您應該將其作爲單獨的答案發布。 – titaniumdecoy 2013-06-17 23:09:37

+0

謝謝@titaniumdecoy。我很高興我能幫上忙! – 2013-06-18 01:19:09

3

我發表了這個評論到另一個答案,但這可能會對其他人有所幫助。

drawRect:被實現時(即使該方法是空的並且什麼都不做),UIView只在其底層CALayer上調用setNeedsDisplay。這告訴UIView的setNeedsDisplay它的圖層也有一些繪圖要完成。

另一種方式來獲得該層的setNeedsDisplay將被自動調就是將圖層的標誌needsDisplayOnBoundsChange設置爲true,這將引發setNeedsDisplay每當視圖邊界的變化(這會自動更改層的邊界)。但要回答你的問題,如果你沒有覆蓋drawRect:,你所做的很好,否則它是多餘的。

相關問題