1

我正在编写一个补丁托架控件,并且我正在使用 UIViews 来绘制补丁之间的链接。

这些链接是大 UIView 的子视图,它本身就是 UIScrollView 的子视图。

链接可以变得非常大,通常是屏幕大小的四倍。当其中一个结束补丁移动时,需要重新绘制链接。

但是,在某些情况下,只有一部分链接是可见的。

Instruments 表示大部分时间都花在了我的 QCLink drawRect 方法上。

我检查了每次需要重绘此 QCLink 时,是否使用 QCLink 的完整边界调用 drawRect 方法。

这是我只需要重绘 UIView 的一部分(drawRect 中的 rect 参数:)的情况吗?

以下是一些屏幕截图,可帮助您了解我面临的问题。

初始状态 拖动节点并扩展链接 他相同的节点,缩小

4

3 回答 3

1

您可能正在寻找一个CATiledLayer. 平铺层仅绘制屏幕上需要渲染的部分,使其非常适合屏幕可能太大或您要捏合缩放的视图。它们是如何UIWebView呈现视图的核心。

要切换视图以使用平铺层,您只需声明此方法:

+ (Class)layerClass
{
    return [CATiledLayer class];
}

然后,您将开始看到带有诸如, ...drawRect:之类的值的调用(0, 0, 256, 256)(0, 256, 256, 256)

在移动东西时,您可以通过调用setNeedsDisplayInRect:而不是setNeedsDisplay. 这会将绘图限制为无效的矩形。

于 2013-10-03T19:01:33.803 回答
1

什么情况下drawRect没有收到UIView的全帧?

您的绘图实现应始终准备好绘制您的视图的一部分。对于某些任务,默认剪辑是好的。

只需遵循视图无效过程——如果您使矩形无效,则视图系统会遍历视图并要求它们绘制该矩形中的内容(考虑不透明度等因素)。该矩形可能是(由)矩形的联合,但也可能被系统裁剪。

因此,您可能正在过度绘制或进行多余的绘制——考虑如何减少这种情况。对于初学者,您可能希望将所有电线放在一个视图中,并尽一切可能将不透明的表面最小化。在那之后,你应该确定你在哪里透支。Quartz Debug 可以指出这些多余的绘制。您应该使用setNeedsDisplayInRect:而不是setNeedsDisplay,尤其是在绘图时间很关键的情况下。

于 2013-10-03T19:19:15.413 回答
0

它始终是完整的矩形。用CAShapeLayers 代替呢?

就像是:

CAShapeLayer * link = [ CAShapeLayer layer ] ;
link.strokeColor = [ [ UIColor greenColor ] CGColor ] ;

CGMutablePathRef p = CGPathCreateMutable() ;
CGPathMoveToPoint( p, NULL, start ) ;
CGPathAddLineToPoint( p, NULL, end ) ;
link.path = path ;

[ parentView.layer addSublayer:link ] ;
于 2013-10-03T18:06:11.547 回答