如何在 ScrollVIew 中仅加载可见子视图
Posted
技术标签:
【中文标题】如何在 ScrollVIew 中仅加载可见子视图【英文标题】:how to Load only visible subviews in UIScrollIVew 【发布时间】:2015-07-02 14:51:27 【问题描述】:我在 UIScrollView 中加载我的 Feed 数据(feedArray),我一次在 Scrollview 中加载 10-10 条记录。
第 1 步:首先我从我的网络服务中将 10 条记录放入我的 feedArray。
第 2 步:现在我正在 UIScrollView 中加载 10 条记录,现在非常好。
第 3 步:现在当我再次调用 web 服务时,我又得到了 10 条记录,现在我再次将它们添加到 feedArray 中,feedArray 计数现在是 20 条记录。和 UIScrollView For 循环运行 20 次
第4步:像这样我会调用webservice的次数,每次feedArray都会增加10条记录。
结果:在滚动视图中加载子视图数量后,当达到 250 条记录时,我的滚动视图卡住并且滚动非常慢,最后在所有 ios 设备中崩溃。
由于 UIScrollView 中的子视图重载导致了所有这些问题,所以我需要克服这些问题。
注意:我在滚动视图中加载了 19 种类型的提要,每个提要包含多个子视图,每个提要是一个带有子视图数量的 UIView。
任何帮助将不胜感激。
谢谢你们。
【问题讨论】:
你没有使用 UITableView 的任何原因? 是的,我有 19 种不同大小的提要会出现,所以我不能使用 19 种类型的自定义单元格,这就是我不使用 UITableView 的原因。还有一件事我的整个应用程序没有使用任何 AutoLayouts 和 Sizeclasses。 我为 UIView 创建了一个 Category 类,并在 App 中的所有 UIScrollViews 中使用它们。 19 个自定义单元格没有错 【参考方案1】:我猜你应该使用 UITableView。您的滚动视图变慢的原因是它无法为所有不同的子视图设置动画。 UITableViews 通过隐藏不可见的视图来处理这个问题。
更多信息 https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableView_Class/
【讨论】:
【参考方案2】:这里推荐使用 UITableView 和 UICollectionView。 由于两者都有单元重用机制,不会影响应用的运行时内存。
【讨论】:
【参考方案3】:为什么不使用 UICollectionView 和 UICollectionViewController 类? UICollectionViewController 参考Here
【讨论】:
【参考方案4】:从逻辑上讲,您可以按如下方式执行此操作,但此操作过于昂贵。为了解决您的问题,我建议 UICollectionView 以任何方式检查滚动视图的代码(不推荐)。
CGRect intersectRect= CGRectMake(0,scrollView.contentOffset.y,scrollView.frame.size.width, scrollView.frame.size.height);
for (UIView *subview in scrollView.subviews )
if (CGRectIntersectsRect(intersectRect, subview.frame)) // checking for intersection
// views in this condition are visible
else
// views in this condition are invisible
将此代码放在一个方法中,并在scrollview委托方法scrollViewDidEndDecelerating中调用该方法:
希望对你有帮助
【讨论】:
以上是关于如何在 ScrollVIew 中仅加载可见子视图的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI ScrollView:查找当前在屏幕中心可见的子视图。子视图在 ScrollView 中的位置。偏好键。滚动视图代理