我找不到一個像樣的答案來解釋這兩個函數之間的區別。 什麼時候每個人都會打電話,以及一個人和另一個人有什麼不同?drawrect vs layoutsubviews - NSView - 可可觸摸
例如,我不能只是佈局我的意見裏面drawrect?
感謝
我找不到一個像樣的答案來解釋這兩個函數之間的區別。 什麼時候每個人都會打電話,以及一個人和另一個人有什麼不同?drawrect vs layoutsubviews - NSView - 可可觸摸
例如,我不能只是佈局我的意見裏面drawrect?
感謝
-layoutSubviews
是,如果已經設置了「需要的佈局」(使用-setNeedsLayout
從-layoutIfNeeded
叫,或者當視圖邊界改變時自動)。用它來定位
您的看法
[編輯:用它來定位子視圖]。
-drawRect:
從-displayIfNeeded
如果「需要顯示」標誌(使用-setNeedsDisplay
,或如果設置view.contentMode = UIViewContentModeRedraw
自動)設定調用。
-layoutIfNeeded
和-displayIfNeeded
都是在UIKit/CoreAnimation自動調用之前繪製屏幕;你很少需要直接打電話給他們。
可以在-drawRect:
定位您的子視圖(你甚至可以添加子視圖!),但是這是不明智的:
-setNeedsDisplay
不上界的變化自動調用。-drawRect:
降低性能(UIKit/CoreAnimation必須爲您創建一個位圖支持的圖形上下文);只有在需要執行自定義繪圖時才這樣做。-drawRect:
中的視圖。繪圖很昂貴。移動視圖很便宜。編輯:有些時候我清醒,更詳細:
什麼是「顯示」和「畫」的區別?顯示由-[CALayer display]
完成;默認的實現爲(大約)
-displayLayer:
,調用[self.delegate displayLayer:self]
。-displayLayer:
應該設置layer.content
到(例如)一CGImage,-drawLayer:inContext:
,建立一個位圖支持的情況下,打電話[self.delegate drawLayer:self inContext:context]
,並且輸出保存到layer.content
(輸出實際上是一個CABackingStore ,這大概是一個私人API)layer.content
。視圖是層的委託,這樣你就可以實現-[MyView displayLayer:]
代替,並做一些有趣的東西一樣
self.layer.contents = (id)([UIImage imageNamed:@"foo"].CGImage)
(是的UIImageView做大致的)也許我不知道所有的答案,但我可以說你是: - 當setNeedDisplay被稱爲
的drawRect被稱爲 - 當視圖框改變 layoutSubviews被稱爲大多數時候你不會使用layoutSubviews。
可能還有其他案件,但它可以給你一個第一塊答案^^
好運的
請給出更詳細的在你的說法,「大部分的時間你不會用layoutSubviews。」 – 2013-08-29 03:40:18
偉大的答案。謝謝! – Idan 2010-09-25 11:39:14