【问题标题】:Draw interactive polyline in UIView (Core Graphics? OpenGL?)在 UIView 中绘制交互式折线(核心图形?OpenGL?)
【发布时间】:2014-03-24 19:23:54
【问题描述】:

对于一个 iOS 项目,我试图在实时交互的 UIImageView 上绘制一条折线。也就是说,用户可以在线上的任意点触摸一个手柄并拖动它来重塑它。

我可以在 Core Graphics 中画线,当我尝试拖动它时,手势识别器会频繁调用setNeedsDisplay,导致内存警告和崩溃。 Xcode 告诉我 Xcode 说“由于内存压力而终止。”

我正在画这样的线,但有一个用于多个段的 for 循环。但是,drawRect 的内容似乎不是问题。即使我把内容全部评论出来,频繁调用setNeedsDisplay也会极大地影响性能。

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

    CGContextBeginPath(ctx);
    CGContextSetStrokeColorWithColor(ctx, [[UIColor blueColor] CGColor]);
    CGContextSetLineWidth(ctx, 6.0);
    CGContextSetAlpha(ctx, 1.0);
    CGContextMoveToPoint(ctx, pointA.x, pointA.y);
    CGContextAddLineToPoint(ctx, pointB.x, pointB.y);
    CGContextStrokePath(ctx);

    CGContextRestoreGState(ctx);
}

我环顾四周,只看到在地图套件中执行此操作的教程。必须有某种方法来完成这项工作。也许 Core Graphics 不是最好的方法?

编辑:UIImageView 是 UIScrollView 中的高分辨率图像(取自 iPhone 相机)。我猜想调用setNeedsDisplay 来获得这么大的视图会占用大量资源?

【问题讨论】:

    标签: ios cocoa-touch opengl-es uikit core-graphics


    【解决方案1】:

    绘图代码很好。使用手势识别器存在固有的延迟和开销,我认为这会导致您的问题(在我看来)。您应该实现 -(void)touches... 事件(其中有四个)

    【讨论】:

    • 我尝试过使用它,但问题似乎恰恰相反。也就是说,在短平移手势中,手势识别器可能在一秒钟内调用setNeedsDisplay 超过 40 次。也许这是由于 UIView 的大小,但这似乎是导致内存飙升超过 300MB 的原因。其他想法@Jef 有什么想法吗?
    【解决方案2】:

    知道了。问题是它在一个非常大的 UIView 上过于频繁地调用setNeedsDisplay。 Apple 建议将它们保持尽可能小,尽管它们不再限于特定大小。在绘制图像之前调整图像大小应该会消除任何内存警告。

    在这里找到:https://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/uiview/uiview.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多