【问题标题】:User Interactive Core Graphics line without memory warning/crash没有内存警告/崩溃的用户交互式核心图形行
【发布时间】:2014-03-17 21:03:27
【问题描述】:

我正在开展一个项目,该项目涉及用户与在 UIImage 之上的 Core Graphics 中呈现的直线进行交互。行的每一端都有一个供用户交互的“句柄”。拖动时,会调用setNeedsDisplay 并重新绘制线条,因为长度和角度会发生变化。

我正在使用下面的代码来重绘这条线。这很简单,但我开始认为 Core Graphics 可能不是解决此问题的正确方法。

下面是drawRect调用的:

- (void)drawLines {
    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);
    }

编辑: 我面临的问题是,当我快速拖动此项目时,内存使用量激增,我收到内存警告,然后它崩溃了。 Xcode 提示“由于内存压力而终止。”

提前感谢您的想法!

【问题讨论】:

  • 你能详细说明为什么你认为核心显卡不适合这个,或者你认为为什么会出现内存问题?
  • 为了实时更新线条,当用户拖动手柄时,手势识别器不断导致setNeedsDisplay被调用。在 Xcodes 的调试导航器中,我可以看到内存使用量激增,然后如果我继续拖动手柄,我会收到内存警告并最终崩溃。
  • 如果你想更新 UI 以反映新行,没有别的办法。
  • 我可能会误解这一点,但这是否意味着没有办法在 Core Graphics 中创建用户交互行而不导致崩溃?我想做的基本上就像大多数图像编辑软件中的线条工具。如果 Core Graphics 不是做到这一点的最佳方式,您能推荐一个更好的解决方案吗?
  • 如果你崩溃了,你应该在你的问题中给出崩溃的细节。这样的 CoreGraphics 不应该只是崩溃。

标签: ios iphone cocoa-touch core-graphics didreceivememorywarning


【解决方案1】:

解决了。 UIView 的尺寸太大了。在如此巨大的 UIView 上调用 setNeedsDisplay 将导致内存峰值和崩溃。 Apple 曾经将 UIView 限制为 1024x1024。虽然这不再是限制,但他们仍然建议减小大小以保持较低的内存占用。

来源:https://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/uiview/uiview.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-20
    • 2013-04-27
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多