UITableView indexPathsForVisibleRows 返回错误的行
Posted
技术标签:
【中文标题】UITableView indexPathsForVisibleRows 返回错误的行【英文标题】:UITableView indexPathsForVisibleRows returns wrong rows 【发布时间】:2013-12-12 21:19:36 【问题描述】:在我的 ios 7 应用程序中,我将视图设置为“在顶部栏下扩展边缘”,因此当您向下滚动时,当您在导航栏下滚动它时,我的 uitableview 具有半透明效果。但是,当您滚动回顶部或加载时,它会将第一个单元格正确定位在导航栏下方,而不是在其下方。
问题是,indexPathsForVisibleRows 会看到导航栏下方的单元格。例如,如果我们向下滚动,我们看到的只是单元格索引 1(第二个单元格),单元格索引 0 位于导航栏下方,当我们调用 indexPathsForVisibleRows 时,它返回索引 0 而不是索引 1 作为最低单元格可见。
还有其他方法吗?
【问题讨论】:
它给您带来了什么问题?您实际上看不到该单元格吗? 我需要获取顶部可见单元格的索引,我们可以实际看到的那个,而不是导航栏后面的那个 导航栏下的单元格可见。它显示在导航栏后面。您需要一种不同的方法来确定导航栏正下方的单元格。 您可能需要根据单元格框架实现自己的逻辑。看看这个:***.com/questions/9831485/… 看indexPathsForRowsInRect:
【参考方案1】:
一种选择是获取导航栏底部的 y 坐标并将其转换为 tableview 的坐标系。一旦有了它,您就可以根据该点从 tableview 中获取 indexPath 或单元格。
UINavigationBar *navbar = self.navigationController.navigationBar;
CGRect localFrame = [self.tableView convertRect:navbar.bounds fromView:navbar];
CGPoint point = CGPointMake(0, localFrame.origin.y + localFrame.size.height + 1);
NSIndexPath *path = [self.tableView indexPathForRowAtPoint:point];
【讨论】:
非常有用的方法,但我必须提供导航栏的高度而不是 1。 出于某种原因,即使添加 NavBarHeight 我仍然使用此解决方案获得不正确的值,仅将 0 和 1 作为 .Row。【参考方案2】:Safe Area 是不包含任何半透明条的表格视图区域的名称。在UITableView
上添加类别,返回安全区中的行,如下所示:
UITableView+SafeArea.h
@interface UITableView (SafeArea)
- (NSArray<NSIndexPath *> *)sa_indexPathsForSafeAreaRows;
@end
UITableView+SafeArea.m
@implementation UITableView (SafeArea)
- (NSArray<NSIndexPath *> *)sa_indexPathsForSafeAreaRows
return [self indexPathsForRowsInRect:self.safeAreaLayoutGuide.layoutFrame];
@end
【讨论】:
以上是关于UITableView indexPathsForVisibleRows 返回错误的行的主要内容,如果未能解决你的问题,请参考以下文章
UItableview 单元格的动态高度与 UItableview 单元格内的 UItableview
水平 UITableView 中的垂直 UITableView
如何与重叠显示的 UITableView 交互另一个 UITableView