菜鸟教程小白 发表于 2022-12-12 18:05:38

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


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

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

<p>我可以:</p>

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

<p>或</p>

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

<p>我想知道的是:</p>

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

<p>谢谢!</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您肯定知道的唯一方法是进行一些实验。我意识到这不是一个过于有用的答案,但我至少可以给你一些提示:</p>

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

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

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

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

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

<p>一些额外的提示:</p>

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

<p>我希望这可以帮助您入门。祝你好运!</p></p>
                                   
                                                <p style="font-size: 20px;">关于objective-c - 具有数百个数据点的 UIScrollView 最佳实践,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/8012255/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/8012255/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: objective-c - 具有数百个数据点的 UIScrollView 最佳实践