2014-12-29 28 views
0

我的看法層次結構如下所示:(我用Autolayout的drawRect取決於視圖 - >在啓動自定義視圖使用錯誤的幀

  • ContentView
    • CustomView(實現drawRect
    • Button
    • TableView

CustomViewdrawRect我從通過所有CustomView.SuperView.subViews頂部至底部繪製UIBezierPath其中線停止,如果Frame處於方式,並開始以進一步繪製直到下一幀等。

StartupDrawRect被稱爲Views尚未完成佈局我猜,因爲我從視圖中得到的幀是不正確的。如果我在ViewDidAppear方法調用

customView.setNeedsLayout() 
customView.layoutIfNeeded() 

問題得以解決。但是這會影響性能,導致它被調用兩次。 什麼是正確的方法來做到這一點?

回答

1

您的方法違反了原理tell, don't ask。你應該是告訴你的看法在哪裏畫;它不應該是 ing。

CustomView

  • 擺脫任何電話來self.superview
  • 添加屬性,代表您需要繪製的信息(如@property NSArray *framesToSkip
  • drawRect:查看您的財產以瞭解您需要的信息。

在您的視圖控制器:

  • viewWillLayoutSubviews:,更新您的自定義視圖的framesToSkip屬性與相應的視圖。
  • 如果需要,請在您的自定義視圖上致電setNeedsDisplay

一些一般性的規則,如果壞了,說明你可能違反出來,不問

  • 從不訪問視圖的superview
  • 切勿訪問視圖控制器的parentViewControllerpresentingViewController
  • 永遠不要導入視圖控制器類,除非它是您的孩子/呈現視圖控制器。
+0

爲什麼你認爲訪問超級視圖是錯誤的?當超視圖爲零時,視圖有很多事情不應該做。 – uchuugaka

+0

特別是要有一個適當的上下文來繪製。 – uchuugaka

+0

@uchuugaka'drawRect:'如果沒有合適的上下文將不會被調用。 –

相關問題