如何使UIScrollView加载数据作为滚动发生

时间:2013-10-11 18:44:06

标签: ios6 uiscrollview

我有一个专为ipad设计的IOS应用程序。在一个页面中,我向用户显示一个报告,报告需要在UIScrollView内的屏幕上呈现5000个UILabel。这会导致应用程序因内存不足而崩溃。我知道UITableView具有按需加载内容的功能。如何使滚动视图仅呈现某些内容,并且当滚动发生时删除不可见的内容并添加应该可见的内容?

3 个答案:

答案 0 :(得分:0)

有什么方法可以重新配置它以使用带有自定义行的表视图,也许是由多个标签组成的行?该模型以非常自然的方式支持按需加载和资源重用......

也许您可以更具体地对待屏幕布局?

答案 1 :(得分:0)

您应该重新循环(即重复使用)标签,就像表视图回收其表格单元格一样。这有时被称为“平铺”子视图。平铺允许您显示超过适合内存的内容。

我建议观看WWDC 2012 Session 104.本课程的教程将创建一个照片应用程序,用于在UIScrollView中平铺图像视图。虽然照片应用程序滚动内容页面而不是项目网格,但我认为视频可能与您的应用程序相关。

以下是适用于您的具体案例的教程的简要概述:

(1.)声明跟踪标签的iVars:

NSMutableSet *recycledLabels;
NSMutableSet *visibleLabels;

(2。)实现了一个获取可重复使用标签的方法:

- (UILabel *)dequeueRecycledLabel;

(3。)实现了一个执行平铺的方法:

- (void)tileLabels; // this will add/remove labels from the scroll view

(4。)设置滚动视图的委托并在scrollViewDidScroll:委托方法中调用tileLabels

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    [self tileLabels];
}

WWDC视频将​​帮助您填写我认为适用于您的案例的详细信息。但是,您必须进行大量即兴创作才能使其适合您的具体情况。这可能并不容易;但它可行。

在视频结束时,讨论了使用CATileLayer进行平铺。我会说实话,我不明白那一部分。但我不认为它适用于您的情况,因为您没有显示大图像。

答案 2 :(得分:0)

我终于实现了动态内容加载。我实现的方法是 scrollViewDidScroll 。 在这个方法中,我通过以下

确定了滚动的方向
bool isUp = (currentOffset.y > lastScrollOffset);

然后我通过以下方式确定了可见内容矩形。

CGRect visibleContentRect;
visibleContentRect.origin = scrollView.contentOffset;
visibleContentRect.size = scrollView.bounds.size;

然后我有了一个View Elements数组,每个都知道它在滚动视图中的位置,因为它们的框架被设置了。长话短说,每次滚动发生时,我确定了其框架与可见内容框架交叉或包含的视图。我将这些视图添加到滚动视图中。我还确定了那些消失并从滚动视图中删除它们的东西,我还将这些视图设置为nil并重新创建它们。调用 [scrollView addSubview:view] 方法后,视图会在内存中获得更多空间,因为它可见。 [view removeFromSuperView] 方法不会释放该空间。这就是为什么将视图设置为nil并重新创建它是必要的。