UITableView:当tableFooterView显示时运行代码?
我在我的UITableView中使用UIView tableFooterView在我的表的底部显示“加载更多”标签。 当显示tableFooterView中的UIView时,我需要启动一些懒惰的内容下载。 我如何知道tableFooterView何时显示?
而不是决定何时页脚视图将显示您可以检查表的最后一行何时被请求 ,然后加载数据。 用户滚动到最后一行而没有向下滚动查看页脚的次数可能非常less。 效果将是相同的,即你知道什么时候用户滚动到底部,你应该加载更多的数据。
这可以很容易地在tableView:cellForRowAtIndexPath:
。 通过跟踪IndexPath是最后一行,并在每次添加或删除新行时对其进行更新,您可以简单地检查请求的单元格的IndexPath是否与最后一行的IndexPath相同,并触发延迟加载来自那里的更多数据,就像你现在正在做的那样。
您可以将页脚的框架转换为窗口坐标并进行比较。 当页脚被隐藏时,假设它的坐标原点坐标> 480(对于肖像模式),当页脚出现时,Y坐标原点坐标<480。可以在didScroll方法中进行比较。
谢谢,希望这对你有所帮助。
请参阅convertRect:toView方法:
因为tableFooter就像你说的那样是一个UIView,它在drawRect:中处理绘图。 如果您覆盖,您可能会收到通知。
编辑:旧的答案是错的。
如果您的tableFooterView
正在观察对表的contentOffset
属性tableFooterView
的更改(也可能还会更改表的contentSize
属性),则可以使用以下variables准确计算滚动到视图中的时间:
-
tableView.contentOffset.y
– 内容视图的原点从滚动视图的原点偏移的垂直量 -
tableView.contentSize.height
– 内容视图的高度 -
tableView.bounds.size.height
– 表格边界的高度
如果垂直内容偏移+表格边界高度超过表格内容大小高度,我们可以假设页脚正在视图中。
你可以把它包装在if语句中,并用它来发送通知。 然后,您可以进行进一步的testing,以使页脚dynamic拉伸或其他预期的效果:
if((tableView.contentOffset.y + tableView.bounds.size.height) > tableView.contentSize.height){ //send notification, dynamic resizing, etc...` }
以下是一些实际的代码片段:
// Set up an observer for changes in the table's contentOffset or contentSize. // This can be done during initialisation of the tableFooterView [tableView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:NULL]; [tableView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:NULL]; // Further down in code, listen for the changes: - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([keyPath isEqualToString:@"contentOffset"] || [keyPath isEqualToString:@"contentSize"]) { if((tableView.contentOffset.y + tableView.bounds.size.height) > tableView.contentSize.height){ // the tableFooterView should now be in view [[NSNotificationCenter defaultCenter] postNotificationName:@"scrollToLoadNeedsLoad" object:self]; // dynamically change the footer here (ideal for making it stretch with the table) } } }
您可以在视图控制器内实现这个function,该function可以保存对表的引用,也可以将其封装在自定义的ScrollToLoadView中。