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 的最佳实践
同时使用多个 NSURLConnections - 最佳实践