【问题标题】:UIView Drawing Best PracticesUIView 绘图最佳实践
【发布时间】: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/…
  • 好吧,这就是我添加它作为评论的原因。我想您可能正在寻找比简单正方形更复杂的形状 :) 祝你好运!

标签: objective-c ios uiview drawrect


【解决方案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];
    猜你喜欢
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 2019-09-13
    相关资源
    最近更新 更多