【问题标题】:How to present a "gallery" on the ipad?如何在ipad上呈现一个“画廊”?
【发布时间】:2011-04-11 16:05:06
【问题描述】:

我正在为 ipad 构建一个应用程序,它使用 youtube api 来获取视频缩略图并将它们呈现在画廊中(就像 ipad 上的原生 youtube 应用程序一样)。基本上它只是 UIScrollView 上的一堆 UIImageViews。现在的问题是一次显示所有图像可能会导致应用程序由于内存问题而崩溃,所以想法是只保留可以看到的图像,并将其他图像写回文件。

我的问题是如何获得 UIScrollView 内容的确切“可见”区域边界。

有什么想法吗?

【问题讨论】:

  • 可能导致内存问题?你真的收到过内存警告吗?我创建了显示数百个缩略图并且没有内存问题的滚动视图。这可能是过早的优化吗?

标签: iphone ipad uiscrollview uiimageview bounds


【解决方案1】:

你看过AQGridView吗?它就是为这类事情而设计的。

【讨论】:

    【解决方案2】:

    观看 WWDC 2010 Session 104 - 使用滚动视图设计应用程序。

    【讨论】:

      【解决方案3】:

      当 UIScrollView 滚动时,您应该检查内容偏移量 (scrollView.contentOffset) 并获取(例如)x 值。有了它(并且取决于 uiscrollview 的宽度框架值),您应该能够知道用户在看什么。尝试使用 NSLog 打印这些信息 ;-)

      然后,当您知道用户正在查看哪个“页面”时,您可以加载一些 UIImageView。

      祝你好运:-)

      【讨论】:

      • 是的,我试过了。但我从来没有得到确切的结果......例如,我应该使用 scrollViewDidScroll 方法还是 scrollViewDidEndDragging:willDecelerate: 来获取 contentOffset 并加载 imageViews?
      • 我认为您应该使用 scrollViewDidScroll ,每次滚动视图时都会调用它。结果如何?
      【解决方案4】:

      layoutSubviews 你可以像这样得到当前可见的边界:

      CGRect visibleBounds = [self bounds];
      

      然后,您可以通过将其框架与 visibleBounds 进行比较来检查 UIView(例如 UIImageView)是否可见:

      BOOL visible = CGRectIntersectsRect(visibleBounds,cellFrame);
      

      只需检查每个可见视图并删除可见边界之外的视图。然后检查数据集中是否有可见但还没有视图的图像。

      您还应该重用 UIView,而不是一直创建新的。只需在 NSSet 中将已删除的队列排入队列,并在创建新的之前检查该集合。

      【讨论】:

        【解决方案5】:

        这是一种不同的方法:

        使用 UITableView 但调整属性使其看起来像常规滚动视图。 (基本上,每行包含几个缩略图,并删除行分隔符。)

        随着行移出屏幕,视图将被回收,并且 UIImageView 使用的内存也可以回收。

        请注意,这需要一些额外的工作才能准确了解用户按下了哪个缩略图,但这并不难。我过去曾这样做过,并使用 tag 属性来存储数组索引。这并不理想,但它是一个足够简单的 hack。

        请注意,这仅在您的表格仅垂直滚动时才有效。据我所知,你不能有一个水平滚动的 UITableView。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-02-11
          • 2017-06-10
          • 2014-12-05
          • 1970-01-01
          • 2018-05-21
          • 2018-05-01
          • 2019-11-16
          • 1970-01-01
          相关资源
          最近更新 更多