【问题标题】:Too many UIViews? What's the cost, what are the tradeoffs?UIView 太多?成本是多少,权衡是什么?
【发布时间】:2013-06-23 02:31:49
【问题描述】:

编辑:

想象一下,我正在重新实现 CoreText。

我会在这里得到一个 NSString,它是一个有序的代码点列表,还有一组字形(一个 NSFont/CTFont),基本上是一个 CGPathRef 的列表。

中间的东西负责布局。

并且某种环境必须提供一个 CGGraphicContext 来渲染。

我必须显示的对象类型 CGPath。我担心为每个 CGPath 创建一个 UIView!对于一个文本块,您不会为每个字符字形创建一个 UIView,对吗?


我有一组可能很大的(小)对象要一次绘制。在 1000 年代。在滚动到视图中之前,许多都将在屏幕外显示。

一方面,我最好的选择是为每个创建一个 UIView。原因是:

  • 通过适当的平铺,我可以确保屏幕外的视图 大多数时候甚至不在记忆中,当 必填

  • 更重要的是,在缩放时,我想将每个此类视图的图层 contentScale 设置为 zoomFactor,这样我仍然可以获得完整的 精确而不是模糊的楼梯

另一方面,我不知道(否则完全通用的)父视图将如何处理 1000 个子视图。 所以我很想重新考虑我的代码,使“孩子”成为单一视图的一个区域。 但是后来我开始考虑设置该视图的图层 contentScale 并且我担心在缩放时会耗尽内存:我不知道图层机制是否“聪明”到不会创建一个巨大的支持位图,而它的大部分内容是反正看不见

怎么办,哦,怎么办?

有人有什么经验想分享吗?

【问题讨论】:

    标签: uiview uiscrollview


    【解决方案1】:

    如果大多数对象在任何时候不会出现在屏幕上,最好不要为所有这些屏幕外对象创建视图。您需要智能地为那些可见的对象添加视图,并在它们离开屏幕时将它们从视图层次结构中删除。您也许可以使用 UICollectionView 来简化此操作 - 它设计精良、高效、灵活且易于使用和自定义 - 但我不知道它是否适用于缩放。

    如果您决定在一个视图中使用深度缩放来绘制所有内容,您应该查看CATiledLayer。它专为非常深入地放大而设计。 Apple 的 MKMapView 在幕后使用它来支持将其视口从地球大小缩小到(相对)几平方米。

    【讨论】:

    • 我看过CATiledLayer,但我承认对levelOfDetailslevelOfDetailsBiasCALayer.contentScale 之间的联系(如果有的话)有点困惑...
    【解决方案2】:

    我最近看到一个关于游戏的演示,其中涉及数百个以 UIView 形式实现的精灵,主要是图像视图。在旧款和最新一代 iPad 上的性能都非常出色。他的代码可以在https://github.com/bentford/ButtonWars/ 找到,所以你可能想测试一下它的性能是否满足你的需求。

    人们通常认为观点是重量级的,但经验并不能证明这一点。

    【讨论】:

      【解决方案3】:

      如果您由于 iOS 版本限制而无法使用 UICollectionView,并且您有兴趣重新使用 UIScrollView 中的视图,请查看 this 类。它的使用方式与使用 UITableview 的方式相同。只需传入视图数量,它就会重用视图。您可以阅读自述文件。它非常简单。

      【讨论】:

      • 不错的无耻插件尝试 :) 不,这对我没有帮助。让我们假设我的每一个小对象都是一个字符字形的问题。不是,但足够接近。您不会使用 UICollection 绘制 NSString 作为字形布局引擎,对吗?我的对象对于这个来说太小了,开销可能会导致项目死在它的轨道上。
      • UICollectionView 不在乎您的对象是否很小。它可以扩展到数千个对象。所以根据所提供的信息,我真的不明白你的反对意见。
      • 我已经给出了一个不使用 UICollectionView 的类的链接。它只是一个简单的 UIScrollview。此外,如果您的视图非常小,您可以创建一个大视图来保存和管理您的一堆小视图。通过这个,您需要传递给数据源的视图数量将变为 1/numberOftinyViewPerLargeView 次。:p .
      • @TimothyMoose 真的想象一下我正在重新实现 CoreText。我在这里有一个 NSString,它是一个有序的代码点列表,还有一组字形(一个 NSFont/CTFont),基本上是一个 CGPathRef 列表。中间的东西负责布局。并且某种环境必须提供一个 CGGraphicContext 来渲染。我必须显示的对象类型 CGPath。我担心为每个 CGPath 创建一个 UIView!对于文本块,您不会为每个字符创建一个 UIView,对吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      • 2011-03-12
      • 1970-01-01
      • 1970-01-01
      • 2011-12-09
      相关资源
      最近更新 更多