在 UIScrollView 上显示大 UIView 的最佳方式是啥?

Posted

技术标签:

【中文标题】在 UIScrollView 上显示大 UIView 的最佳方式是啥?【英文标题】:What is the best way to show large UIView on UIScrollView?在 UIScrollView 上显示大 UIView 的最佳方式是什么? 【发布时间】:2014-04-09 11:48:12 【问题描述】:

我有一个很大的UIView。它的大小可变。它可能大于 5000x5000 size。我使用UIBezierPath 在其上画线和圆圈。我还在上面添加了一些view。这些subview 中的每一个都包含buttonstextviewlabels 等。

我将此主视图放在UIScrollView 上。 UIScrollViewzoomable 并且必须非常清晰地显示内容(它不应该变得模糊)。

目前,我绘制完整的UIView 并添加到UIScrollView。问题是,它占用了太多memorycrashing 因为Memory Pressure Issue.

我应该如何处理以实现高性能?

【问题讨论】:

您的视图需要在运行时更改,或者您正在构建不需要更改的大图像? @TiagoAlmeida,我两者都需要,第一次加载时我的视图将保持不变,但它会随着用户的交互而改变。 【参考方案1】:

继承 UIView 并在其中实现+layerClass 方法:

+layerClass

    return [CATiledLayer class];

这会导致您的视图由CATiledLayer 支持,而不是单个巨大的CALayer(在该大小下会消耗太多内存)。

然后您只需在自定义视图类中实现-(void)drawRect:(CGRect)rect 并在其中完成所有绘图。我最近在我的项目中必须这样做,该项目使用 UIScrollViews 滚动一个可以达到 10000 x 150000 的区域。

【讨论】:

嗨,杰夫,如果我有一个大小为 6000X6000 的 UIView,使用 UIBezierPath(in drawRect:) 进行了一些绘图,我应该如何使用它进行平铺?请给点提示。 如果您已经在 drawRect 中进行绘图,则除了如图所示实现 +layerClass 方法外,您无需执行任何操作。平铺将自动发生,您的drawRect 将在每个平铺滚动到视图时被调用 感谢您的宝贵建议。将来也会感谢您的帮助。【参考方案2】:

我认为您可以使用CATiledLayer 平铺来降低内存压力,但这完全取决于您加载的内容、时间和其他一些方面。 平铺是一个复杂的话题,你可以找到更多信息here

【讨论】:

以上是关于在 UIScrollView 上显示大 UIView 的最佳方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 [UIScrollView removeFromSuperview] 崩溃了?

试图在 uiscrollview 内部绘制

UIScrollView + LargeTitle (iOS 11) - 滚动到顶部并显示大标题

UIScrollView 未显示在 UIViewController 上

UIScrollView 中的 UIToolbar 修复了 UIViewController 作为子视图滚动问题

以编程方式滚动时在 UIScrollView 上显示滚动指示器