在子视图上方绘制drawRect?

7
我创建了一个容器视图来容纳许多子视图 - 集合视图、自定义工具栏和一些小部件。
设计在顶部、左侧和右侧都有边框,但底部没有边框,因此我重写了drawRect函数以包含边框。
当我添加工具栏时,我注意到它出现在边框的上方。(出于某种原因,我最初认为它不会,但它肯定会!) 有没有办法告诉drawRect函数在我的子视图上方绘制? 当然还有很多其他解决问题的方法(例如调整工具栏的框架),但我问这个问题是为了深入了解绘图与合成和视图层次结构之间的关系。

请考虑使用 zIndex - onmyway133
3个回答

8
画布发生在UIView所有子视图的下面。可以把它看作是在非常基础的位置 - 实际上是视图的一部分 - 然后每个子视图都添加在你的视图之上。让绘画位于子视图之上就相当于希望子视图出现在视图之下,同时仍然是子视图。也许这个类比会更清晰地说明为什么它必须始终在底部。这也逻辑上导致了解决方案:
要使绘画显示在子视图之上,只需创建一个新的UIView子类来放置绘画代码,并将其放置在所有其他子视图之上。
重写您UIView的addSubview:实现可能也是一个好主意,以确保您的子视图始终保持在顶部。

1
谢谢。回过头来看,这是一个疯狂的问题。当然,绘图必须遵守视图层次结构。它还能做什么呢? - Jasper Blues

2

我认为你不能这样做,因为drawRect首先为视图调用,当它完成绘制后,会为子视图调用drawRect以覆盖它。也许只需在该视图上创建另一个子视图,该子视图具有所需的边框并且在其他地方是透明的?


2
子视图是在它们的父视图之上绘制的。所以你的问题的答案是否定的。
当你在容器视图上绘制边框时,Cocoa甚至还没有开始绘制工具栏。
我想你可以将边框的顶部作为一个子视图或将工具栏向下移动一点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接