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

问题描述:

我的看法层次结构如下所示:(我用Autolayout的drawRect取决于视图 - >在启动自定义视图使用错误的帧

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

CustomViewdrawRect我从通过所有CustomView.SuperView.subViews顶部至底部绘制UIBezierPath其中线停止,如果Frame处于方式,并开始以进一步绘制直到下一帧等。

StartupDrawRect被称为Views尚未完成布局我猜,因为我从视图中得到的帧是不正确的。如果我在ViewDidAppear方法调用

customView.setNeedsLayout() 
customView.layoutIfNeeded() 

问题得以解决。但是这会影响性能,导致它被调用两次。 什么是正确的方法来做到这一点?

您的方法违反了原理tell, don't ask。你应该是告诉你的看法在哪里画;它不应该是 ing。

CustomView

  • 摆脱任何电话来self.superview
  • 添加属性,代表您需要绘制的信息(如@property NSArray *framesToSkip
  • drawRect:查看您的财产以了解您需要的信息。

在您的视图控制器:

  • viewWillLayoutSubviews:,更新您的自定义视图的framesToSkip属性与相应的视图。
  • 如果需要,请在您的自定义视图上致电setNeedsDisplay

一些一般性的规则,如果坏了,说明你可能违反出来,不问

  • 从不访问视图的superview
  • 切勿访问视图控制器的parentViewControllerpresentingViewController
  • 永远不要导入视图控制器类,除非它是您的孩子/呈现视图控制器。
+0

为什么你认为访问超级视图是错误的?当超视图为零时,视图有很多事情不应该做。 – uchuugaka

+0

特别是要有一个适当的上下文来绘制。 – uchuugaka

+0

@uchuugaka'drawRect:'如果没有合适的上下文将不会被调用。 –