从drawRect中抽取UIView的边界

时间:2010-11-29 04:17:30

标签: iphone objective-c core-graphics drawrect

我的问题非常类似于Not drawing outside bounds when clipToBounds=NO这个没有得到明确答案的问题。

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

有没有办法在我的观点范围外画画?我尝试过更改clipsToBounds属性,但似乎没有任何效果。

我无法从超级视图中绘制线条,因为我需要使用多个视图来执行此操作,而有些视图会在其他视图之前...从superview的drawRect中找出图层似乎是一个坏主意。

同样地,我认为我不能只调整我的视图范围以包含整个屏幕,因为我的视图需要动态调整大小...边界必须是巨大的(> 20,000点平方)为了这个工作。

1 个答案:

答案 0 :(得分:9)

我不建议在视图范围之外绘图。您的视图需要自动调整大小以包含绘图,或者您需要具有透明的重叠视图。或两者。我想不出这两种情况都不会涵盖的情况,但我可能缺乏想象力。 =)

目前正在发生的事情是,当超级视图被重绘时,它告诉超级视图它需要重绘,从而导致删除你在外面做的绘图。已经有一段时间了,如果我错了,任何更有知识的人都可以(应该!)在这里纠正我。

我不知道“Quartz Debug”(来自标准的apple developer tools安装,/Developer/Applications/Performance Tools/Quartz Debug)是否可以在模拟器中运行,但值得一试。它有一个模式,可以显示重绘的时间和频率,刷新时有边框和可选的延迟。

你可以按照自己的意思去做,但每次超出子视图边界时都需要强制重绘子视图,这意味着你的超级视图需要在它的绘图功能中手动绘制它的子视图。基本上你会丢掉苹果的绘图范例,只是让你的子视图就像主视图的绘图扩展一样。

此外,如果您的范围非常动态,您可能需要考虑绘制屏幕或超级视图的百分比而不是点数,这可能对代码更有意义。