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 子类?