1

我有UIView一个drawRect包含 CoreGraphics 自定义绘图代码的变量大小。视图最初非常小,但有可能变得非常宽,并放置在 aUIScrollView中以使用户能够滚动视图。

目前,视图被创建为适合整个绘图所需的宽度,CoreGraphics 代码在drawRect.

- (void)drawRect:(CGRect)rect {

    // Only try and draw if the frame size is greater than zero and the graph has some range
    if ((self.frame.size.width>0) && (self.frame.size.height>0) && ((maxX - minX)>0)) {

        // Get the current drawing context
        CGContextRef context = UIGraphicsGetCurrentContext();

        // Save the state of the graphics context
        CGContextSaveGState(context);

        // Set the line style
        CGContextSetRGBStrokeColor(context, 0.44, 0.58, 0.77, 1.0); 
        CGContextSetRGBFillColor(context, 0.44, 0.58, 0.77, 1.0);
        CGContextSetLineWidth(context, 3.0);
        CGContextSetLineDash(context, 0, NULL, 0);

        // Draw the graph
        [self drawGraphInContext:context];

        // Restore the graphics context
        CGContextRestoreGState(context);
    }
}

我可以通过以下方式提高效率:

  1. 使用 rect 参数进行边界计算,drawRect并且仅绘制当前可见的内容。
  2. 创建一个较小的UIView(比如 scrollView 框架宽度的 2 倍)并随着滚动位置的移动,重绘图像并将滚动视图重新居中。

在我努力做这些事情之前,我想了解是否值得付出努力,以及如果 UIView 变得非常宽,我以后是否会遇到问题。到目前为止,性能不是问题,但我担心内存可能是问题。

具体来说,scrollView 是否将视图使用的内存量限制在可见区域?是图形上下文创建的整个视图的大小,可见区域还是rect参数的大小?CoreGraphics 是否简单地忽略了可见区域之外的绘图操作?

任何帮助和最佳实践建议将不胜感激。

4

1 回答 1

1

IMO,这完全取决于rect调用的参数:

- (void)drawRect:(CGRect)rect

据我所知,这将设置为contentSize您的滚动视图。简单地说,上下文和用于它的内存将与该rect值相关。

您可能会尝试通过考虑frame滚动视图来对您绘制的区域进行自己的“剪辑”。

更好的是,您可以查看 Apple 关于在 UIScrollView 中平铺内容的示例。是样品 3。

于 2012-06-01T07:32:56.840 回答