2013-10-21 86 views
5

我创建了一个容器视图,该视图包含一系列子视图 - 一个集合视图,一个自定义工具栏和一些小零件。drawRect覆盖子视图?

该设计在顶部,左侧和右侧有一个边框,但不是底部,所以我将覆盖drawRect以包含边框。

当我添加工具栏时,我发现它出现在边框的顶部。 (出于某种原因,我最初认为它不会,但当然它!)。

有无论如何我可以告诉drawRect绘制我的子视图顶部?

当然,还有其他一些方法来解决我的问题(例如调整工具栏的框架),但我问这个问题,以深入了解绘图如何工作与合成和视图层次结构。

+0

考虑使用'zIndex' – onmyway133

回答

5

绘图发生在UIView的所有子视图下。将其视为基础 - 您视图的实际部分 - 然后将每个子视图添加到视图顶部。为了制作上面的图纸,子视图与子视图出现在视图下同时仍然是子视图相同。也许这种比喻更清楚地说明为什么它总是处于最底层。并且它也会引导您逻辑地进入解决方案:

要让绘图出现在子视图上方,只需创建一个新的UIView子类来放置绘图代码,并将其放在其他所有子视图之上。

覆盖你的UIView的addSubview:实现可能也是一个好主意,以确保你的子视图始终保持在最前面。

+0

谢谢。回顾过去的疯狂问题。当然,绘图必须服从视图层次结构。它还能做什么? –

2

我相信你不能,因为drawRect被视为第一个视图,当它完成绘图时,drawRect被调用以便子视图绘制它。也许只是在该视图的顶部创建另一个子视图,该视图具有您需要的边框并且在其他地方都是透明的?

2

子视图是drawn on top of their super views。所以你的问题的答案是否定的。

当你在容器视图上绘制边框时,Cocoa甚至还没有开始绘制工具栏。

我想你可以使边界的顶部为子视图或向下移动工具栏。