UIView 绘图最佳实践

Posted

技术标签:

【中文标题】UIView 绘图最佳实践【英文标题】:UIView Drawing Best Practices 【发布时间】:2012-10-17 13:32:18 【问题描述】:

我的应用程序能够绘制一些简单的图形(在我获得更稳定的代码之前,我只使用一个图形)并且它还能够重新调整它们的大小。我用来创建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),这是:

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

1) 我应该考虑为UIView 设置一个最大大小吗?

2) 我如何使用这些工具来跟踪此类问题,并查看问题出在哪里(或者在哪里完成了繁重的工作)。

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

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

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

UIView 的大小调整主要基于this。

【问题讨论】:

您是否考虑过使用 QuartzCore 并仅使用视图的 layer 属性来绘制边框? 问题是:这是一个简单的数字。最后我会有更复杂的,我不认为玩UIView 的属性就足够了。不过谢谢你的建议。 如果您需要绘制较大的内容(可能需要缩放),您可能需要查看CATiledLayer developer.apple.com/library/ios/#documentation/GraphicsImaging/… 好吧,这就是我添加它作为评论的原因。我想您可能正在寻找比简单正方形更复杂的形状 :) 祝你好运! 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

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

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

【讨论】:

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

以上是关于UIView 绘图最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

在 UIView(不是 MKMapView)中使用 lat/long 的最佳实践

以正确方向以编程方式显示 UIView 的最佳实践

重用类最佳实践

同时使用多个 NSURLConnections - 最佳实践

在所有 ViewControllers swift ios 11 中添加背景图像的最佳实践

为 UITableView 设置数据源和委托的最佳实践