UIView绘制最佳实践

时间:2012-10-17 13:32:18

标签: objective-c ios uiview drawrect

我的应用程序能够做一些简单的图形绘制(直到我得到一个更稳定的代码,我只坚持一个数字),它也能够重新调整它们的大小。我用来创建UIView的代码如下:

- (void)drawRect:(CGRect)rect
{    
    CGContextRef context = UIGraphicsGetCurrentContext();

    [self setContextFillColor:context];
    [self setContextStrokeColor:context];
    [self setLineWidth:context];

    CGFloat lineThickness = [self lineWidth] ;
    CGFloat halfLineThickess = lineThickness / 2.0f;

    CGContextAddRect(context, CGRectMake(halfLineThickess,halfLineThickess, rect.size.width - lineThickness, rect.size.height - lineThickness));

    CGContextDrawPath(context, kCGPathEOFillStroke);
}

这给了我,输入大小为(100.0f,100.0f),这个:

enter image description here

此图位于“容器”UIView内,而容器UIScrollView位于UIView内。我的问题是当我重新调整我的身材并且我达到大约1000 * 1000的大小(我的“容器”是20,000 * 20,000)时,我开始接收内存警告并且应用程序最终放弃了。所以我的问题是:

1)我应该考虑为UIView添加最大尺寸吗?

2)我怎样才能使用这些仪器来跟踪这类问题,看看问题出在哪里(或者在哪里进行繁重的工作)。

3)我应该使用像this这样的缓存吗?

4)绘制CALayer时是否需要考虑一些最佳做法

5)我应该考虑UIView,虽然我需要听一听吗?

重新调整{{1}}的大小主要基于this

2 个答案:

答案 0 :(得分:1)

1)如果您使用正确的方法,我认为这个尺寸不是问题。

2)您应该使用Instruments查看关于跟踪内存问题的WWDC视频

3,4)我认为- (void)drawRect:(CGRect)rect这不是一个好习惯。如果你看一下绘图CALayer会更好。您可以使用自定义CGMutablePathRef进行绘图。

所以UIView适合处理触摸但不适合绘制形状。

答案 1 :(得分:1)

你不应该创建这么大的UIView。它太大了。这类问题是CATiledLayer旨在解决的问题。基本上,您需要跟踪形状的边界框,并使用这些边界框来确定哪些切片与哪些形状相交。当系统要求给定的图块时,则绘制与其相交的所有形状。对于非常大且复杂的形状,您可以通过分割形状进一步优化,但通常不需要这样做。