草庐IT

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

coder 2024-01-16 原文

Microsoft Outlook 曾经有——现在可能仍然有——一个滚动的时间线 View ,显示 outlook 中发生的所有事件。我想在我的应用程序中重新创建类似的东西。

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

我可以:

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

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

我想知道的是:

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

谢谢!

最佳答案

您唯一可以确定的方法是进行一些试验。我知道这不是一个很有帮助的答案,但我至少可以给你一些提示:

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

  • 同时在屏幕上显示多个 UIView(包括 UILabel 等)会严重影响性能。如果每个数据点都是一个 View 并且您可以缩小以查看所有数据点,您就会遇到这种情况。
  • 相反,拥有巨大的 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/

有关objective-c - 具有数百个数据点的 UIScrollView 最佳实践的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  5. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  6. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  7. objective-c - 在设置 Cocoa Pods 和安装 Ruby 更新时出错 - 2

    我正在尝试为我的iOS应用程序设置cocoapods但是当我执行命令时:sudogemupdate--system我收到错误消息:当前已安装最新版本。中止。当我进入cocoapods的下一步时:sudogeminstallcocoapods我在MacOS10.8.5上遇到错误:ERROR:Errorinstallingcocoapods:cocoapods-trunkrequiresRubyversion>=2.0.0.我在MacOS10.9.4上尝试了同样的操作,但出现错误:ERROR:Couldnotfindavalidgem'cocoapods'(>=0),hereiswhy:U

  8. ruby-on-rails - Rails 中同一个类的多个关联的最佳实践? - 2

    我认为我的问题最好用一个例子来描述。假设我有一个名为“Thing”的简单模型,它有一些简单数据类型的属性。像...Thing-foo:string-goo:string-bar:int这并不难。数据库表将包含具有这三个属性的三列,我可以使用@thing.foo或@thing.bar之类的东西访问它们。但我要解决的问题是当“foo”或“goo”不再包含在简单数据类型中时会发生什么?假设foo和goo代表相同类型的对象。也就是说,它们都是“Whazit”的实例,只是数据不同。所以现在事情可能看起来像这样......Thing-bar:int但是现在有一个新的模型叫做“Whazit”,看起来

  9. ruby-on-rails - 向 Rails 3 添加 Ruby 扩展方法的最佳实践? - 2

    我有一个要在我的Rails3项目中使用的数组扩展方法。它应该住在哪里?我有一个应用程序/类,我最初把它放在(array_extensions.rb)中,在我的config/application.rb中我加载路径:config.autoload_paths+=%W(#{Rails.root}/应用程序/类)。但是,当我转到railsconsole时,未加载扩展。是否有一个预定义的位置可以放置我的Rails3扩展方法?或者,一种预先定义的方式来添加它们?我知道Rails有自己的数组扩展方法。我应该将我的添加到active_support/core_ext/array/conversion

  10. ruby - 最佳原则中的原则 - 2

    我似乎经常遇到一些设计问题,但我不知道是什么是真的很合适。一方面我经常听到我应该限制耦合和坚持单一职责,但当我这样做时,我常常发现它很困难到在需要时将信息获取到程序的一部分。为了例如,classSingerdefinitialize(name)@name=nameendattr:nameend那么Song应该是:classSongdefnew(singer)@singer=singerendend或classSongdefnew(singer_name)@singer_name=singer_nameendend后者耦合性小,按道理应该用。但如果我以后发现宋有什么需要了解更多歌手,我的

随机推荐