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