【问题标题】:Really, really big UIScrollViews真的,真的很大的 UIScrollViews
【发布时间】:2010-03-05 16:13:24
【问题描述】:

我正在尝试制作一个详细程度折线图,用户可以在其中使用两根手指水平放大/缩小,并增加 UIScrollView 字段的 contentSize 属性。他们还可以水平滚动以向左或向右移动并查看更多图表(查看谷歌财经图表上的任何股票以了解我在说什么)。当用户放大时,滚动视图可能会增长到其原始大小的 100 倍。

我的问题是: - 有没有人对具有如此大的 contentSize 限制的 UIScrollViews 有任何经验?它会起作用吗? - 滚动视图的视图可能非常大,因为用户正在放大。这在内存中是如何处理的?
- 只是一个想法,但是否可以使用面向水平滚动的 UITableViewCells 来分页/分页数据?

现在这是一个开放式问题 - 我仍在头脑风暴中。如果有人有任何想法或曾经实施过这样的事情,请以您的经验回应。谢谢!

【问题讨论】:

  • 你有什么想法吗?我正在尝试使用 CATiledLayer 或 UIView 的回收来做同样的事情。

标签: iphone uiscrollview


【解决方案1】:

这是一个相当古老的话题,但我还是想分享一些我的经验。 在 UIScrollView 中使用如此大的 UIView(比其原始大小的 100 倍)可能会导致内存警告。您应该避免一次渲染整个 UIView。 实现这一点的更好方法是渲染您可以看到的唯一区域及其周围的区域。所以,UIViewScroll 可以在这个区域内平滑滚动。但是如果用户滚动出已渲染的区域怎么办?当用户滚动出预渲染区域并尝试渲染将要显示的新区域时,使用委托获得通知。 这个实现的基本思想是当用户从旧位置滚动(或移动)到新位置时,使用 9 个 UIView(或更多)来平铺更大的区域。只需将一些 UIView 移动到新位置,以确保其中一个 UIView 是您可以看到的主要视图,而其他 8 个 UIView 就在它周围。 希望有用。

【讨论】:

【解决方案2】:

我也有类似的东西,虽然可能没有你说的那么大。 UIScrollView 不是问题。问题是,如果您在其上绘制 UIView(而不是自己绘制线条),那么良好的 UIView 会继续存在于内存中。如果您实际上是通过创建自己的 UIView 并响应 drawRect 来绘制线条,那很好。

假设你是一个经验丰富的程序员,让一个绘制图表部分的大滚动视图工作只是一天的工作,所以我的建议是为它创建一个原型,并在对象下运行原型分配工具,看看这是否表明有任何问题。

对不起,我的回答含糊不清;这是一个头脑风暴的问题

【讨论】:

    【解决方案3】:

    但是,这种方法(在上面的示例中)在某些情况下仍然不够好。因为我们只在 UIScrollView 中渲染了一个有限的区域。

    用户可以在 UIScrollView 中使用不同的手势:拖动或甩动。通过拖动,在大多数情况下,预渲染的 8 个小 UIView 足以覆盖滚动区域。但是通过flinging,当用户快速移动时,UIScrollView 可以滚动到一个非常大的区域,而这个区域在滚动时是完全空白的(因为我们没有渲染它)。即使我们可以在 UIScrollView 停止滚动后显示正确的内容,滚动过程中的空白对用户的 UI 也不是很友好。

    对于某些应用,这是可以的,例如 Google 地图。由于无法立即下载数据。等待下载是合理的。

    但是如果数据是本地的,我们应该尽可能消除这个空白区域。因此,预渲染要滚动的区域至关重要。与 UITableView 不同,UIScrollView 没有能力告诉我们要显示哪个单元格以及要回收哪个单元格。所以,我们必须自己做。方法[UIScrollViewDelegate scrollViewWillEndDragging:withVelocity:targetContentOffset:]会在UIScrollView开始减速时被调用(其实scrollViewWillBeginDecelerating是在减速前被调用的方法,但是在这个方法中我们不知道会显示什么内容或者滚动什么内容) .所以根据 UIScrollView.contentOffset.x 和参数 targetContentOffset,我们可以准确的知道 UIScrollView 从哪里开始,从哪里停止,然后预渲染这个区域,让滚动更流畅。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-10
      • 2010-12-28
      • 2013-01-25
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      相关资源
      最近更新 更多