获取ScrollView直观的所有可见子视图?

时间:2014-05-17 14:36:26

标签: objective-c uiscrollview

我使用scrollView实现了我自己的UICollectionView(找到为什么检查我的上一个问题)。 它工作得很好,现在我想尝试这个:

获取ContentOffset的当前scroller,而不是发现此矩形中的子视图。

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

for(UIView *view in [scroller subViews] )
if(view.frame viewIntersectsWithAnotherView:rect)
nslog(@"yes");

从性能方面来说这是好事吗?有没有更好的办法 ?如果这种方式很好,我究竟能如何表现呢?

感谢。

1 个答案:

答案 0 :(得分:2)

直接实现将迭代所有子视图 - 您需要跟踪的单独数组。 (为什么不超过scrollView.subviews - 请参阅this question),您可以进行简单的检查

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

现在至于优化

  1. 如果您认为此方法将比用户滚动更频繁地调用,请使用委托方法在滚动结束时计算和缓存可见视图
  2. 如果您希望使用表格视图 - 就像单元格定位中的逻辑一样,您可以使用框架数组中的二进制搜索来获取 O(log n)中的可见单元格
  3. 延迟缓存 - 首次需要时重新计算属性并重复使用,直到下次使用滚动(标记缓存的可见单元格无效)。
  4. ...
  5. 正如您所看到的,它在很大程度上取决于您要优化的方案。

    现在需要解决一个重要问题:正如您所知,集合视图会循环使用单元格以优化性能,如果您在设置数据源后立即布置所有视图,则会在内存中爆炸。

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