的drawRect取决于视图 - >在启动自定义视图使用错误的帧
问题描述:
我的看法层次结构如下所示:(我用Autolayout
)的drawRect取决于视图 - >在启动自定义视图使用错误的帧
-
ContentView
-
CustomView
(实现drawRect
) Button
TableView
-
在CustomView
的drawRect
我从通过所有CustomView.SuperView.subViews
顶部至底部绘制UIBezierPath
其中线停止,如果Frame
处于方式,并开始以进一步绘制直到下一帧等。
对Startup
当DrawRect
被称为Views
尚未完成布局我猜,因为我从视图中得到的帧是不正确的。如果我在ViewDidAppear
方法调用
customView.setNeedsLayout()
customView.layoutIfNeeded()
问题得以解决。但是这会影响性能,导致它被调用两次。 什么是正确的方法来做到这一点?
答
您的方法违反了原理tell, don't ask。你应该是告诉你的看法在哪里画;它不应该是问 ing。
内CustomView
:
- 摆脱任何电话来
self.superview
。 - 添加属性,代表您需要绘制的信息(如
@property NSArray *framesToSkip
) - 在
drawRect:
查看您的财产以了解您需要的信息。
在您的视图控制器:
- 在
viewWillLayoutSubviews:
,更新您的自定义视图的framesToSkip
属性与相应的视图。 - 如果需要,请在您的自定义视图上致电
setNeedsDisplay
。
一些一般性的规则,如果坏了,说明你可能违反出来,不问:
- 从不访问视图的
superview
。 - 切勿访问视图控制器的
parentViewController
或presentingViewController
。 - 永远不要导入视图控制器类,除非它是您的孩子/呈现视图控制器。
为什么你认为访问超级视图是错误的?当超视图为零时,视图有很多事情不应该做。 – uchuugaka
特别是要有一个适当的上下文来绘制。 – uchuugaka
@uchuugaka'drawRect:'如果没有合适的上下文将不会被调用。 –