确定UIView子类的可见部分(框架),作为子视图添加到表视图中的单元格

时间:2014-11-06 13:37:32

标签: ios objective-c xcode uitableview uiview

让我们调用这个UIView子类 - SomeClass。这个SomeClass是静态库的一部分。一些客户将使用此库,并将此SomeClass的实例添加到其(客户)表视图的单元格中。

I(SomeClass)需要确定SomeClass何时“进入”屏幕(将变为可见),何时“退出”屏幕(将变为不可见)。

我可以使用didMoveToWindow:方法,然后检查self.window是否为零。但是,有一个问题,SomeClass在它实际可见之前得到了这个事件,因为细胞通过表视图概念“准备”。我需要确切知道,某些用户可以100%看到它。

  1. 确定的一种方法是使用scrollViewDidScroll:。假设SomeClass将通过在超级视图上使用迭代来获得滚动视图,并将订阅为找到滚动视图的委托。但是他将被一些单元格删除,该单元格将自己订阅为滚动视图的委托。所以我需要在这里发明一些解决方案。例如,在Android中,有可能添加观察者,在这种情况下,SomeClass始终是一个侦听器,并不会覆盖任何其他侦听器。 Android中存在多对一关系,而不像iOS中那样,一对一。

  2. 另一方面,当SomeClass变得可见时,我可以在didMoveToWindow:中启用一些计时器,这将检查每个X时间及其帧。当SomeClass从屏幕开始时,计时器将被禁用。

  3. 可能有一种方法可以在低级别检查,而不使用某些低级重绘方法的滚动视图和计时器。有可能吗?

  4. 那么什么是最好的(将使用更少的资源/良好的设计)方法?

1 个答案:

答案 0 :(得分:0)

您可以使用CGRectIntersectsRect检查单元格的框架是否与自定义视图的框架相交。除此之外,didMoveToWindow是您正在寻找的方法。

如果您说表视图单元格总是将SomeClass作为子视图,那么使用UITableViewDelegate tableView:willDisplayCell:forRowAtIndexPath:会更有意义。