在 UIScrollView 中长时间滚动一个非常大的 UIView 会导致资源问题吗?
Posted
技术标签:
【中文标题】在 UIScrollView 中长时间滚动一个非常大的 UIView 会导致资源问题吗?【英文标题】:wiil one very large UIView for long scrolling in UIScrollView cause resource issues? 【发布时间】:2016-11-17 21:55:06 【问题描述】:在使用 UIScrollView 创建无限滚动功能(不循环回到开始)方面,实际上对于日历,在 UIScrollView 中长时间滚动的一个非常大的 UIView 会导致资源问题吗?
假设:
-
假设有人以编程方式将子视图添加/删除到此主背板视图,因为它即将需要显示/可见,然后删除。
不想使用 UICollectionView(请将问题集中在 UIScrollView 的使用上)
要求:
-
希望将 UI 视图放在此背景平面上并直接绘制到它,例如添加线条。
因此需要添加/删除诸如绘制的线条以及 UILabel 之类的东西。 (还没有深入研究线条以及它们是否需要在自己的子视图中绘制,然后在其上添加删除这些“线”子视图,而不是直接在 drawrect 中绘制到主背板视图上)李>
背景:
我看到了一些建议,有 3 个“页面”(视图),并且您在滚动时不断移动它们,但这似乎更复杂。【问题讨论】:
您基本上是在要求重新创建 UITableView / UICollectionView 因为这是他们所做的。他们保留了一个单元格池,当您调用 dequeReusableCell 时,您会从池中获取一个单元格,或者如果它为空,您将获得一个新单元格。当细胞离开屏幕时,它们会被放回队列中进行回收。通过这种方式,类似音乐的应用程序可以表示一个包含 10,000 多首歌曲的数据源,只有 10-12 个表格视图单元格,因为在任何给定时间都是可见的。 是的 - 部分是学习过程 我理解您关于“无收藏视图”视图的言论和想法,但我完全建议您查看文章Custom Collection View Layouts,因为他们正在使用日历讨论您的情况并且有一些优点关于实施。我认为这会有所帮助。 关于性能问题,我不明白你的解决方案。 UIScrollView 已经是 UIView,您可以通过.contentSize
属性控制大小并将您的子视图直接添加到 UIScrollView。但在我看来,这种 UI 是不支持且难以维护的。例如,您会遇到很多关于 iPad 支持或方向更改等问题。
嗨@dive - 好的理解 - 所以我实际上是在问是否可以将“.contentSize”设置为非常大而没有资源问题。我猜你可以,因为真正的问题是管理你放在这个上的子视图,但是想仔细检查。
【参考方案1】:
就您使用视图而言,不应该存在任何资源问题。 我开发了一种具有下一个视图结构的地图应用程序。
MapScrollView (UIScrollView)
- TileContainerView (UIView)
- TileContainerSubViews[10..] (UIView)
- TileLayer [] (CALayer)
- UIButton[]
- IconLayer[] (CALayer)
- TrackLineLayer (CALayer)
- .....
层次结构中的所有 Tile**View 和 MapScrollView 共享相同的大小,与 TileContainerSubViews[n] 的大小对齐,该 TileContainerSubViews[n] 进一步容纳许多大小为 256x256 的 TileLayer。最大的 TileContainerSubView[] 可以容纳多达 10000x10000 个 TileLayer(s) 视图大小为 2560000x2560000。 (当然,由于资源问题,我们实际上不能添加那么多层。)所有的视图/层都是在途中添加/删除的。
请注意,您可以创建大型 UIView 但不能创建 CALayer。 当我尝试创建巨大的 CALayer 时,程序以一些错误消息终止。 CATiledLayer 好像没有这个约束但是我没有测试过。
【讨论】:
谢谢 - 你在 ios 开发社区中偶然遇到的开源版本有没有? 将示例代码放在github.com/beshio/sample-code。代码仅供参考。这是我写的第一个 iOS 程序,所以很乱,可能在做一些愚蠢的事情。无论如何,在 1991 行,它将视图的框架设置为 (256xsome_large_number)。以上是关于在 UIScrollView 中长时间滚动一个非常大的 UIView 会导致资源问题吗?的主要内容,如果未能解决你的问题,请参考以下文章
在另一个视图中滚动 UIScrollView 时更快地滚动它