2013-09-24 51 views
5

如果我創建一個子類UIView,並希望使用的定製內容一堆(使用CAShapeLayer秒,在drawRect使用CGContextRef定製的圖紙通過CABasicAnimation動畫)時是創建,添加和動畫子層的最佳時機?當是正確的時間以動畫,並在UIView子類添加子層

我知道我應該在drawRect方法中執行自定義圖紙(並且因爲只有當我實際上可以獲得UIGraphicsGetCurrentContext()時,這會使我的選擇縮小)。現在我已經在drawRect中創建了子圖層,動畫和所有其他非繪圖相關的東西。但我不確定drawRect是做這些活動的最佳地點。

我熟悉layoutSubviews方法和其他一些UIView方法,但實際上並沒有實現其中任何一個,除了drawRect

所以如果我再重複一次自己 - 問題是:在哪裏添加子圖層,在哪裏爲它們設置動畫,並且是否有任何技巧或捕捉我應該注意?

回答

7
  1. 如果它們是永久性的,您可以在init中創建和添加圖層。如果它們是動態的,layoutSubviews更好。這顯然意味着無論何時需要新的圖層/項目,都需要setNeedsLayout。您可以在-init和-layoutSubviews之間儘可能多地混合和匹配,但如果必須選擇,我會傾向於使用layoutSubviews。不要使用drawRect。

  2. 您可以在創建時或在正常執行期間將屬性(strokeWidth,lineColor,路徑等)設置爲CAShapeLayer。這包括設置到CAShapeLayer的路徑。同樣,不要在drawRect中設置屬性。

  3. 如果您想在圖層上進行自定義繪圖,您可以對圖層進行子類化並在該圖層上使用drawRect。如果CALAyers需要重用和擴展,這可能很好。你也可以提供一個CALayerDelegate,只要它不是UIView。看到這些問題:Using CALayer Delegate iOS: Using UIView's 'drawRect:' vs. its layer's delagate 'drawLayer:inContext:'

  4. 動畫是容易的,它遵循相同的原則創建和設置屬性。請務必理解,當自動動畫將被調用,以及如何將其禁用:Disabling implicit animations in -[CALayer setNeedsDisplayInRect:] 同樣不要試圖從的drawRect動畫:How to make my UIBezierPath animated with CAShapeLayer?

  5. 繪畫是昂貴的。動畫很便宜。過多使用drawRect會對應用程序造成較大的性能損失。謹慎使用drawRect/setNeedsDisplay,例如在狀態改變時(選中/未選中)。儘可能修改動畫或頂級屬性的視圖,並且不要重新繪製視圖。使drawRect執行任何操作而不是繪製可能會導致不必要地調用setNeedsDisplay。一個簡單的前期優化是儘可能少地調用drawRect,或者根本不調用。

+0

謝謝。爲什麼不建議使用drawRect進行動畫製作? – Majster

+0

錯過了這一點,它是一個巨大的。編輯我的答案。 – Saltymule

相關問題