drawRect取决于视图 - >在启动时,自定义视图使用错误的帧

时间:2014-12-29 23:58:07

标签: ios swift autolayout drawrect

我的观点层次结构如下所示:(我使用Autolayout

  • ContentView
    • CustomView(实施drawRect
    • Button
    • TableView

drawRect的{​​{1}}我通过CustomView从顶部到底部绘制UIBezierPath,如果CustomView.SuperView.subViewsFrame则在路上,并开始进一步绘制到下一帧,依此类推。

Startup调用DrawRect时,Views未完成布局我猜,因为我从视图中获取的帧不正确。

如果我致电

,问题就解决了
customView.setNeedsLayout()
customView.layoutIfNeeded()
ViewDidAppear方法中的

。但这会影响性能,因为它会被调用两次。 什么是正确的方法?

1 个答案:

答案 0 :(得分:1)

您的方法违反了原则tell, don't ask。你应该告诉你的观点在哪里画;它不应该询问 ing。

内部CustomView

  • 删除对self.superview的任何来电。
  • 添加一个属性,表示您需要绘制的信息(如@property NSArray *framesToSkip
  • drawRect:中查看您需要的信息。

在视图控制器中:

  • viewWillLayoutSubviews:中,使用适当的视图更新自定义视图的framesToSkip媒体资源。
  • 如果需要,请在自定义视图上调用setNeedsDisplay

一些一般规则,如果损坏,表示您可能违反了告诉,请不要问

  • 永远不要访问视图superview
  • 永远不要访问视图控制器的parentViewControllerpresentingViewController
  • 永远不要导入视图控制器类,除非它是您的子视图控制器。