在drawRect方法中如何绘制超出UIView边界的内容?

23

我的问题与这个问题(当clipToBounds = NO时不绘制边界外部)非常相似,但没有得到清晰的答案。

基本上我有一个UIView,并且我想从它的中心绘制一条线,直到屏幕的边缘。使用[self convertPoint:(CGPoint){0,0} fromView:[self superview]];计算这些点很容易(它根据我的视图的superview找到原点)。但是,当我在我的视图的drawRect:中绘制一条线时,它会被裁剪在我的视图的边界处。

有没有办法绘制超出我的视图边界之外?我尝试更改clipsToBounds属性,但似乎没有任何效果。

我不能从superview绘制我的线,因为我需要用多个视图做到这一点,其中一些将在其他视图前面...从superview的drawRect确定图层似乎不是一个好主意。

同样,我认为我不能只调整我的视图边界大小以包括整个屏幕,因为我的视图需要动态地调整大小... 为了使其工作,边界将必须巨大(>20,000个点的正方形)。


记录一下,我选择了一个兄弟视图,并将我用来重新排序视图的所有方法都连接到它,以确保它们也移动兄弟视图。这样做可以提高性能,因为我的任何视图的最大大小都是屏幕大小。 - Kenny Winker
1个回答

10

我不建议在视图范围之外进行绘制。要么你的视图需要自动调整大小来包含绘制内容,要么你需要有透明的重叠视图。或两者都要有。我无法想象有任何这两种情况都无法涵盖的情况,但是可能是我缺乏想象力。 =)

目前可能发生的情况是,当父视图重新绘制时,它会告诉子视图需要重新绘制,导致擦除你在范围之外绘制的内容。已经过了一段时间,如果有更专业的人可以(应该!)在这里纠正我。

我不知道“Quartz Debug”(标准苹果开发者工具安装中的/Developer/Applications/Performance Tools/Quartz Debug)在模拟器中是否可用,但值得一试。它有一种模式,可以显示重新绘制发生的时间和频率,带有边框和刷新的可选延迟。

你可以做你要求的事情,但你需要强制每次超出子视图范围时重新绘制子视图,这意味着你的父视图需要在其绘制函数中手动绘制其子视图。实质上,你将放弃苹果的绘图范例,让你的子视图像主视图的绘制扩展一样运行。

此外,如果你的范围如此动态,你可能需要考虑在屏幕或父视图的百分比范围内进行绘制,这可能更容易编码。


谢谢你的建议。从不同的角度看问题对我很有帮助。我采用了兄弟视图。 - Kenny Winker
16
我的用例是:我希望绘制一个矩形,该矩形可以完美地调整大小以适应其父视图的边界;但我还想在矩形下面添加一个小三角形来指示方向。为了有效地完成这个任务,我需要将小三角形绘制出视图的边界之外。 - Lee Probert
大家好 - 一个简单而明显的用例是当您想要绘制某些东西并放大时,但是您不想更改固有内容大小(即,不影响其他布局元素)。 - Fattie

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