UIScrollView 中的 UIView 子类如何处理内存

Posted

技术标签:

【中文标题】UIScrollView 中的 UIView 子类如何处理内存【英文标题】:How is memory handled with a UIView subclass inside UIScrollView 【发布时间】:2012-06-01 07:23:04 【问题描述】:

我有一个可变大小的UIView 和一个包含CoreGraphics 自定义绘图代码的drawRect。视图最初很小,但有可能变得很宽,并放置在 UIScrollView 内,以使用户能够滚动浏览视图。

此时,视图被创建为适合整个绘图所需的宽度,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);
    

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

- (void)drawRect:(CGRect)rect

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

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

更好的是,您可以查看 Apple 提供的关于 tiling content in a UIScrollView 的示例。这是样本 3。

【讨论】:

以上是关于UIScrollView 中的 UIView 子类如何处理内存的主要内容,如果未能解决你的问题,请参考以下文章

以 UIScrollView 作为子类的 UIView 不接收触摸事件

如何在 UIScrollView 中实现可拖动的 UIView 子类?

使用 UIScrollView 自定义 UIView 子类

iOS:在故事板中将子类从 UIView 更改为 UIScrollView

UIScrollView 上的 UIView 菜单

在 UIScrollView 中拖动一个 UIView