我正在为 ipad 构建一个应用程序,它使用 youtube api 获取视频缩略图并将它们呈现在画廊中(就像 ipad 上的原生 youtube 应用程序一样)。基本上它只是 UIScrollView 上的一堆 UIImageViews。现在的问题是一次显示所有图像可能会导致应用程序由于内存问题而崩溃,所以想法是只保留可以看到的图像,并将其他图像写回文件。
我的问题是如何获得 UIScrollView 内容的确切“可见”区域边界。
有任何想法吗?
我正在为 ipad 构建一个应用程序,它使用 youtube api 获取视频缩略图并将它们呈现在画廊中(就像 ipad 上的原生 youtube 应用程序一样)。基本上它只是 UIScrollView 上的一堆 UIImageViews。现在的问题是一次显示所有图像可能会导致应用程序由于内存问题而崩溃,所以想法是只保留可以看到的图像,并将其他图像写回文件。
我的问题是如何获得 UIScrollView 内容的确切“可见”区域边界。
有任何想法吗?
观看 WWDC 2010 Session 104 - 使用滚动视图设计应用程序。
你看过AQGridView吗?它正是为这类事情而设计的。
当 UIScrollView 滚动时,您应该检查内容偏移量 (scrollView.contentOffset) 并获取(例如)x 值。有了它(并且取决于 uiscrollview 的宽度框架值),您应该能够知道用户在看什么。尝试使用 NSLog 打印这些信息 ;-)
然后当您知道用户正在查看哪个“页面”时,您可以加载一些 UIImageView。
祝你好运 :-)
在layoutSubviews
您可以像这样获得当前可见的边界:
CGRect visibleBounds = [self bounds];
然后,您可以通过将其框架与 visibleBounds 进行比较来检查 UIView(例如 UIImageView)是否可见:
BOOL visible = CGRectIntersectsRect(visibleBounds,cellFrame);
只需检查每个可见视图并删除可见边界之外的视图。然后检查数据集以获取可见但还没有视图的图像。
您还应该重用 UIView,而不是一直创建新的。只需在 NSSet 中对已删除的进行排队,并在创建新的之前检查该集合。
这是一种不同的方法:
使用 UITableView 但调整属性使其看起来像常规滚动视图。(基本上,每行包含几个缩略图,并删除行分隔符。)
随着行移出屏幕,视图将被回收,并且 UIImageViews 使用的内存可以被回收。
请注意,这需要一些额外的工作才能准确地知道用户按下了哪个缩略图,但这并不难。我过去曾这样做过,并使用 tag 属性来存储数组索引。这并不理想,但它是一个足够简单的hack。
请注意,这仅在您的表格仅垂直滚动时才有效。据我所知,你不能有一个水平滚动的 UITableView。