如何在UIScrollIVew中仅加载可见的子视图

时间:2015-07-02 14:51:28

标签: ios objective-c uiview ios8 uiscrollview

我在UIScrollView中加载Feed数据(feedArray),我一次在Scrollview中加载10-10条记录。

第1步:首先,我从我的网络服务中获取10条记录到我的feedArray中。

第2步:现在我在UIScrollView中加载10条记录,现在完全没问题。

第3步:现在当我再次呼叫网络服务时,我又获得了10条记录,现在我再次将它们添加到feedArray,现在feedArray计数为20条记录。和UIScrollView For循环运行20次

第4步:就像我会多次调用网络服务一样,每次feedArray都会增加10条记录。

结果:在滚动视图中加载子视图的数量后,当它达到250条记录时,我的滚动视图卡住并且非常慢地滚动并最终在所有ios设备中崩溃。

因为UIScrollView中的子视图重载导致了所有这些问题,所以我需要解决这些问题。

注意:我在滚动浏览中加载了19种类型的Feed,每个Feed都包含多个子视图,每个Feed都是一个包含子视图数量的UIView。

任何帮助都会非常感激。

谢谢你们。

4 个答案:

答案 0 :(得分:1)

我的猜测是你应该使用UITableView。滚动视图放慢速度的原因是因为它无法为所有不同的子视图设置动画。 UITableViews通过隐藏不可见的视图来处理这个问题。

更多信息 https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableView_Class/

答案 1 :(得分:1)

这里建议使用UITableView和UICollectionView 由于这两种方法都具有单元重用机制,因此不会影响应用程序的运行时内存。

答案 2 :(得分:0)

为什么不使用UICollectionView和UICollectionViewController类? UICollectionViewController引用Here

答案 3 :(得分:0)

从逻辑上讲,您可以按照以下方式执行此操作,但操作过于昂贵。为了解决您的问题,我建议UICollectionView以任何方式检查scrollview的代码(不推荐)。

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:

希望有所帮助