• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

objective-c - 具有数百个数据点的 UIScrollView 最佳实践

[复制链接]
菜鸟教程小白 发表于 2022-12-12 18:05:38 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

Microsoft Outlook 曾经拥有(也许现在仍然如此)Outlook 中发生的所有事件的滚动时间线 View 。我想在我的应用程序中重新创建类似的东西。

我研究了 UIScrollView 的文档,并且知道如何让它按我想要的方式工作。当内容 View 可能很大时,我的问题更适合在 UIScrollView 中呈现数百个项目的最有效方式。

我可以:

  • 例如,组装一个较小 View 的列表,每个 View 代表一天,并使用这些天中的每一天的数据项填充这些较小的 View ,然后将这些聚合 View 作为 subview 附加到内容 View 中。

  • 我可以简单地为要在时间轴上显示的每个数据项使用 subview 填充内容 View 。

我想知道的是:

  1. 从内存和时间的角度来看,呈现所有这些数据点的最有效方式是什么?每个都将作为标签或按钮出现在时间轴上。
  2. 哪种方法更自然地支持捏合和缩放?
  3. 是提前初始化整个内容 View 更好(可能会花费大量时间),还是只在“ View 窗口”附近初始化 View ,然后添加细节作为用户滚动?

谢谢!



Best Answer-推荐答案


您肯定知道的唯一方法是进行一些实验。我意识到这不是一个过于有用的答案,但我至少可以给你一些提示:

众所周知,使用 UIScrollView 有效地显示一屏以上的内容非常困难。在某些情况下,我已经为此苦苦挣扎了好几个星期。这在旧硬件(iPhone 3G/2nd gen iPod 或更早版本)上要糟糕得多,但如果你弄错了,你仍然可以轻松地让现代 iOS 设备爬行。您通常会遇到两个性能问题:

  • 同时在屏幕上显示许多 UIView(包括 UILabel 等)会严重影响性能。如果每个数据点都是一个 View ,并且您可以缩小以查看所有数据点,您就会遇到这种情况。
  • 相反,拥有巨大的 View (大于一屏)同样糟糕,因为整个 View 都需要保存在内存中,而其中任何一个都是可见的。

您可能会发现这与缩放非常不匹配:您不知道一屏到底有多少!

  • 我建议您将所有内容都设置为 View ,并且不要太担心缩放 - 确保在最大缩放级别下一切顺利。
  • 然后,添加缩放功能(您需要将所有小 View 放在一个将被缩放的容器 View 中)并查看它在您支持的最旧硬件上的性能。如果您不允许缩小太多,则无需任何更改即可。
  • 如果在您缩小时它开始卡顿,请尝试将您的内容分割为图 block 。您需要尝试这些大小,但每个图 block 20 多个 subview 可能是一个好的开始。在您的 ScrollView 委托(delegate)中,检测用户何时被充分缩小并通过在其 CALayer 上将 shouldRasterize 属性设置为 true 来强制您的图 block 光栅化。这实际上应该将图 block 的所有 subview 预渲染到纹理中,因此在渲染屏幕时,它将使用该预渲染图像,而不是遍历所有 subview 并单独渲染它们。一旦用户再次充分放大,请确保再次禁用它。还要尽量避免一次为所有图 block 设置它,否则它会卡顿,例如,您可以为每个图 block 设置单独的随机缩放级别阈值。

如果您最终遇到shouldRasterize 问题,您可能需要直接在CALayer 级别工作。如果这些都没有帮助,大锤方法是使用 CATiledLayer 就像 MKMapView 和其他人一样。这需要您自己完成所有渲染和触摸事件处理,并且通常还会导致您在 map 和 Safari 应用程序中滚动时出现(有点难看的)淡入。

一些额外的提示:

  • 避免在内存中保留大量不同的图像。这意味着如果可以的话,可以重复使用少量的 UIImage。如果每个 View 略有不同,请在 drawRect: 中按需生成图像:或者使用过滤器而不是预先将它们绘制为 CGImage,或者从文件中加载它们。
  • 尽可能避免 Alpha 混合(半透明)。
  • 您可以使用性能工具可视化 UIKit 合成的复杂性。查看 WWDC 文件中的核心动画和工具讨论。

我希望这可以帮助您入门。祝你好运!

关于objective-c - 具有数百个数据点的 UIScrollView 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8012255/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap