UIScrollView 似乎在大 ContentSizes 上使用了大量内存
Posted
技术标签:
【中文标题】UIScrollView 似乎在大 ContentSizes 上使用了大量内存【英文标题】:UIScrollView seems to use a lot of memory on big ContentSizes 【发布时间】:2010-07-02 01:27:21 【问题描述】:我创建了一个 UIScrollView (canvas.scrollview) 并在其中有一个自定义 UIView (canvas)。
正常的启动配置是这样的:
CGRect cs2 = CGRectMake(0, 0, 4000, 4000); CGPoint screen = [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height;
self.canvas.frame = cs2; //canvas_size;
self.canvas.scrollView.contentSize = canvas_size.size; self.canvas.scrollView.contentOffset = CGPointMake(canvas_size.size.width/2-screen.x/2, canvas_size.size.height/2-screen.y/2);
但我注意到,当我将滚动视图内容大小设置为更大的值时,例如 4000,4000;它将使用更多的内存。例如:
scrollview view real virtual
1000,1000 1000,1000 6 88
4000,4000 1000,1000 62 145
1000,1000 4000,4000 6 88
如果可能的话,我希望有一个相当大的工作区,但 8000x8000 完全占用了内存。知道为什么滚动视图会占用这么多内存,有没有办法解决这个问题?
【问题讨论】:
UIScrollView 的 contentSize 不影响内存使用。 如果是这样,那为什么只有当我改变 contentSize 时它才会改变? 【参考方案1】:我在当前项目中使用了巨大的滚动视图(数千乘以千像素),这绝对不会发生在我身上。我认为您的UIView
很大可能是问题所在,而不是您的滚动视图。尝试将UIView
的大小设置为 768x1024,然后将滚动视图设置为 4k x 4k,看看问题是否消失。
如果UIView
恰好是图像(我对此表示怀疑,或者您可能会提到它),您应该知道 ios 仅支持最大 1024x1024 大小的图像,之后会有一点“未定义的行为”在内存使用方面。您可能需要查看CATiledLayer
,尽管没有内容的普通 UIView 不应该占用那么多内存,无论它有多大,因此您项目的其他地方也可能存在问题。
【讨论】:
【参考方案2】:我认为不是滚动视图占用了这么多内存,而是画布自定义 UIView 子类。如果画布真的是 4000 x 4000,系统必须分配足够的内存来保存该大小的 32 位深位图,即大约 64 MB。对于如此大的视图,您应该使用 CATiledLayer 来处理静态内容,或者某种平铺视图系统。
【讨论】:
以上是关于UIScrollView 似乎在大 ContentSizes 上使用了大量内存的主要内容,如果未能解决你的问题,请参考以下文章
UIScrollView的contentSize、contentOffset和contentInset的理解
解决UIScrollView中添加子控件出现“UIScrollView Scrollable Content Size Ambiguity”的办法
更改 UIScrollVIew Content Inset 触发 scrollViewDidScroll
contentInsetAdjustmentBehavior 似乎不适用于子 UIControllerView 的 UIScrollview