Objective c 获取一个滚动视图所有可见子视图的一个矩形?

Objective c 获取一个滚动视图所有可见子视图的一个矩形?,objective-c,uiscrollview,Objective C,Uiscrollview,我用一个scrollView实现了自己的UICollectionView(查找为什么要检查我最后的问题)。 它工作得很好,现在我正努力做到这一点: 获取滚动条的当前ContentOffset,然后发现此矩形中有哪些子视图 因此,一种方法是在所有子视图上运行,并检查交叉点,如: for(UIView *view in [scroller subViews] ) if(view.frame viewIntersectsWithAnotherView:rect) nslog(@"yes"); 从性能

我用一个scrollView实现了自己的
UICollectionView
(查找为什么要检查我最后的问题)。 它工作得很好,现在我正努力做到这一点:

获取
滚动条的当前
ContentOffset
,然后发现此矩形中有哪些子视图

因此,一种方法是在所有子视图上运行,并检查交叉点,如:

for(UIView *view in [scroller subViews] )
if(view.frame viewIntersectsWithAnotherView:rect)
nslog(@"yes");
从性能方面看,这是否良好?有更好的办法吗?如果这种方式是好的,我该如何具体执行呢


谢谢。

直接的实现是迭代所有子视图–一个单独的数组,您可以跟踪它。(为什么不跳过
scrollView.subview
–请参阅),您可以运行一个简单的检查

CGRect visibleRect = (CGRect){self.contentOffset, self.bounds.size};
for (UIView *subview in self.registeredSubviews) {
    if (CGRectIntersectsRect(visibleRect, subview.frame)) {
        // it's visible
    }
}
至于优化

  • 若您认为调用此方法的次数比用户滚动的次数要多,请在滚动结束时使用委派方法计算并缓存可见视图
  • 如果您希望在单元定位中使用类似于表视图的逻辑,那么可以使用帧数组中的二进制搜索来获得O(logn)中的可见单元
  • 惰性缓存-第一次需要时计算属性并重复使用,直到下次使用滚动(将缓存的可见单元格标记为无效)
  • 正如您所见,这在很大程度上取决于您希望优化的场景

    现在需要解决的一个重要问题是:如您所知,集合视图会回收单元以优化性能,如果您在设置数据源后立即布局所有视图,则会在内存中爆炸


    此外,这是一个练习还是你有充分的理由不相信
    UICollectionView

    很简单,你不必阅读我的问题,因为我在这里问了另一个问题,对于她,我需要一个答案。。