【问题标题】:UITableView indexPathsForVisibleRows returns wrong rowsUITableView indexPathsForVisibleRows 返回错误的行
【发布时间】:2013-12-12 21:19:36
【问题描述】:

在我的 iOS 7 应用程序中,我将视图设置为“在顶部栏下扩展边缘”,因此当您向下滚动时,当您在导航栏下滚动它时,我的 uitableview 具有半透明效果。但是,当您滚动回顶部或加载时,它会将第一个单元格正确定位在导航栏下方,而不是在其下方。

问题是,indexPathsForVisibleRows 会看到导航栏下方的单元格。例如,如果我们向下滚动,我们看到的只是单元格索引 1(第二个单元格),单元格索引 0 位于导航栏下方,当我们调用 indexPathsForVisibleRows 时,它返回索引 0 而不是索引 1 作为最低单元格可见。

还有其他方法吗?

【问题讨论】:

  • 它给您带来了什么问题?您实际上看不到该单元格吗?
  • 我需要获取顶部可见单元格的索引,我们可以实际看到的那个,而不是导航栏后面的那个
  • 导航栏下的单元格可见。它显示在导航栏后面。您需要一种不同的方法来确定导航栏正下方的单元格。
  • 您可能需要根据单元格框架实现自己的逻辑。看看这个:stackoverflow.com/questions/9831485/…
  • indexPathsForRowsInRect:

标签: ios uitableview


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多