我正在尝试制作详细程度的折线图,用户可以使用两根手指水平放大/缩小,并增加UIScrollView字段的contentSize属性。他们还可以水平滚动以向左或向右移动并查看更多图表(查看Google财经图表上的任何股票以了解我正在谈论的内容)。当用户放大时,滚动视图可能会增长到原始大小的100倍。
我的问题是: - 有没有人对UIScrollViews有过如此大的contentSize限制的经验?它会起作用吗? - 滚动视图的视图可能非常大,因为用户正在放大。如何在内存中处理? - 只是一个想法,但是可以使用面向水平滚动的UITableViewCells来分页/输出数据吗?
现在这是一个开放式的问题 - 我仍在集思广益。如果有人有任何想法或之前已经实施过这样的事情,请回复您的经验。谢谢!
答案 0 :(得分:1)
这是一个相当古老的话题,但我仍想分享一些经验。 在UIScrollView中使用如此大的UIView(比其原始大小大100倍)可能会导致内存警告。你应该避免一次渲染整个UIView。 实现这一目标的更好方法是渲染唯一可以看到的区域和围绕它的区域。因此,UIViewScroll可以在这个区域内顺利滚动。但是如果用户滚出已经渲染的区域呢?当用户滚出预渲染区域并尝试渲染将要显示的新区域时,使用委托获得通知。 当用户从旧位置滚动(或移动)到新位置时,此实现下的基本思想是使用9个UIView(或更多)来平铺更大的区域。只需将一些UIViews移动到新的位置,以确保UIView中的一个主要是您可以看到的主视图,其他8个UIViews就在它周围。 希望它有用。
答案 1 :(得分:0)
我有类似的东西,虽然可能不是你说的那么大。 UIScrollView不是问题。问题是,如果你正在绘制UIViews(而不是自己绘制线条),那么很好的UIViews仍然存在于内存中。如果您实际上是通过创建自己的UIView并响应drawRect来绘制线条,那很好。
假设您是一位经验丰富的程序员,那么获取一个大型滚动视图工作来绘制图表的分析只需要几天时间,所以我的建议是为它创建一个原型,并在该对象下运行原型分配工具,看看是否表明存在任何问题。
很抱歉我的回答模糊不清;这是一个头脑风暴的问题
答案 2 :(得分:0)
但是,在某些情况下,这种方法(在上面的例子中)还不够好。因为我们只在UIScrollView中呈现了一个有限的区域。
用户可以在UIScrollView中使用不同的手势:拖动或拖动。使用拖动,在大多数情况下,预渲染的8个小UIViews足以覆盖滚动区域。但是随着投掷,UIScrollView可以在用户快速移动时滚动一个非常大的区域,并且在滚动时这个区域完全是空白的(因为我们没有渲染它)。即使我们可以在UIScrollView停止滚动后显示正确的内容,滚动期间的空白对用户来说也不是非常友好的UI。
对于某些应用,这很好,例如谷歌地图。由于无法立即下载数据。下载前等待是合理的。
但如果数据是本地的,我们应该尽可能地消除这个空白区域。因此,预渲染要滚动的区域至关重要。与UITableView不同,UIScrollView无法告诉我们将显示哪个单元格以及将要回收哪个单元格。所以,我们必须自己做。当UIScrollView开始减速时,将调用方法[UIScrollViewDelegate scrollViewWillEndDragging:withVelocity:targetContentOffset:](实际上,scrollViewWillBeginDecelerating是在减速之前调用的方法,但在此方法中我们不知道有关将显示或滚动的内容的信息) 。因此,基于UIScrollView.contentOffset.x和参数targetContentOffset,我们可以确切地知道UIScrollView的起始位置以及UIScrollView将停止的位置,然后预渲染此区域以使滚动更加流畅。