7

我创建了一个包含一堆子视图的容器视图——一个集合视图、一个自定义工具栏和一些零碎的东西。

该设计在顶部、左侧和右侧都有边框,但没有底部,所以我覆盖了 drawRect 以包含边框。

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

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

当然,还有很多其他方法可以解决我的问题(例如调整工具栏的框架),但是我提出这个问题是为了深入了解绘图与合成和视图层次结构相关的工作原理。

4

3 回答 3

8

绘图发生在 UIView 的所有子视图下方。将其视为非常基础 - 您视图的实际部分 - 然后将每个子视图添加到您的视图之上。使子视图上方的绘图与希望子视图出现在视图下方相同,同时仍然是子视图。也许这个类比更清楚地说明了为什么它必须总是在底部。它还从逻辑上引导您找到解决方案:

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

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

于 2013-10-21T15:23:18.013 回答
2

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

于 2013-10-21T15:23:23.207 回答
2

子视图绘制在它们的超级视图之上。所以你的问题的答案是否定的。

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

我想您可以将边框的顶部设置为子视图或将工具栏向下移动一点。

于 2013-10-21T15:26:42.643 回答