UIView绘制最佳实践

6

我的应用程序可以绘制一些简单的图形(在我得到更稳定的代码之前,我只使用一个图形),并且还可以调整它们的大小。我用来创建 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内部。 我的问题是,当我重新调整图形大小并达到大约1000 * 1000的大小(我的“容器”为20,000 * 20,000),我开始收到内存警告,最终应用程序放弃了。因此,我的问题如下:

1) 是否应该考虑为UIView设置最大尺寸?

2) 我如何使用工具来跟踪此类问题,并查看问题出现的位置(或重要操作在哪里)。

3) 是否应该使用某种缓存,例如这种缓存

4) 在绘制UIView时,是否有一些通用的最佳实践需要考虑?

5) 是否应该考虑CALayer,尽管我需要监听触摸?

重新调整UIView的大小主要基于操作。


你考虑过使用QuartzCore并仅使用视图的层属性来绘制边框吗? - runmad
事实是:这是一个简单的图形。最终我会有更复杂的图形,我不认为玩弄UIView的属性就足够了。但还是谢谢你的建议。 - Rui Peres
2
如果您需要绘制大型内容(可能需要缩放),您可能需要检查CATiledLayer。http://developer.apple.com/library/ios/#documentation/GraphicsImaging/Reference/CATiledLayer_class/Introduction/Introduction.html - Bastian
好的,这就是为什么我把它添加为注释的原因。我想你可能正在寻找更复杂的形状而不仅仅是一个简单的正方形 :) 祝你好运! - runmad
2个回答

1

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


1

1) 我认为,如果你使用正确的方法,大小不是问题。

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

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

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


我也想在特定的 UIView 上处理手势(如移动和调整大小)。 - Rui Peres
@JackyBoy,这里没有问题,以下是一些步骤: 1)创建新视图 UIView* view 2)创建新层 CALayer* shapeLayer view.layer = shapeLayer 3)添加手势 [view addGestureRecognizer:panGesture]; - Danil

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