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