在 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
中的每一个都包含buttons
、textview
、labels
等。
我将此主视图放在UIScrollView
上。 UIScrollView
是 zoomable
并且必须非常清晰地显示内容(它不应该变得模糊)。
目前,我绘制完整的UIView
并添加到UIScrollView
。问题是,它占用了太多memory
和crashing
因为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 + LargeTitle (iOS 11) - 滚动到顶部并显示大标题
UIScrollView 未显示在 UIViewController 上