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 交互另一个 UITableView

在 UITableView 中的 UINib 中重新加载 UITableView

iOS小技能:1. 什么是UITableView? 2. UITableView如何展示数据