Ios ScrollToRowatinex路径不';我不能正确地处理最后一行

Ios ScrollToRowatinex路径不';我不能正确地处理最后一行,ios,iphone,objective-c,uitableview,user-interface,Ios,Iphone,Objective C,Uitableview,User Interface,我在使用ScrollToRowatinePath:atScrollPosition:animated时,UITableView出现问题,它似乎无法正确处理滚动到最后一行的操作 下面是我用来引起滚动的代码: [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionMiddle

我在使用
ScrollToRowatinePath:atScrollPosition:animated时,
UITableView
出现问题,它似乎无法正确处理滚动到最后一行的操作

下面是我用来引起滚动的代码:

[self.tableView scrollToRowAtIndexPath:indexPath
                      atScrollPosition:UITableViewScrollPositionMiddle 
                              animated:YES];
下面是显示结果(以及问题!)的屏幕截图:

如您所见,最后一行(9月)没有完全滚动到视图中;底部的几个像素被截断

我尝试使用
uitableviewsrollpositionnone
uitableviewsrollpositiontop
uitableviewsrollpositionbottom
作为滚动位置,但它们都产生相同的结果

“我的单元格”的自定义单元格高度为
61.0f
,当前已在情节提要中设置,但添加
UITableViewDelegate
方法
tableView:heightForRowAtIndexPath:
并返回相同的值也没有帮助

是否有任何方法可以使表格视图滚动到最后一行并使其完全可见

编辑:

为了清楚起见,我使用了一个stock
UINavigationController
和一个stock
UITableViewController
作为根视图控制器

编辑2:


如果我使用
rectforrowatinexpath:
来确定行的rect,它实际上会为该行返回正确的rect。但是如果我随后调用
scrollRectToVisible:animated:
使用该矩形,我会得到与上面相同的结果;底部的几个像素被截断。

使用较低级别的功能怎么样?毕竟,
UITableView
是一个
UIScrollView

[self.tableView setContentOffset:(CGPoint){0, self.tableView.contentSize.height - self.tableView.bounds.size.height} animated:YES];

(如果内容边缘插入值不是0,请根据需要调整偏移量)。

我还建议您打开
UIViewController
属性,默认情况下该属性处于启用状态:

@property (nonatomic, assign) BOOL automaticallyAdjustsScrollViewInsets;
当我不知道为什么
UITableView
(实际上是
UIScrollView
的一个子类)没有正确滚动时,这本书帮助了我解决了很多问题。当然,这取决于你的布局

此属性自iOS 7起可用,请在此处阅读更多信息:


好的,我已经成功地解决了这个问题

线索就在这个半相关的问题上

事实证明,在iOS 7中,当出现
视图时,视图尚未布局:
被调用,这意味着不能保证表视图的框架和边界是准确的。由于对
ScrollToRowatineXpath:animated
的调用必须至少使用其中一个来计算偏移量,这就解释了为什么在我的例子中没有正确处理偏移量

我认为在大多数情况下,人们不会遇到这个问题,因为他们的呈现视图控制器可能与呈现视图控制器具有相同的边界。但在我的例子中,我展示了一个视图控制器,它有一个可见的导航栏和状态栏,而另一个则没有,因此需要考虑额外的64个点。从这个控制台输出中可以看出:

2014-03-15 19:14:32.129 Capture[3375:60b] viewWillAppear, tv bounds: {{0, 0}, {320, 568}}
2014-03-15 19:14:32.131 Capture[3375:60b] viewDidLayoutSubviews, tv bounds: {{0, -64}, {320, 568}}
为了解决这个问题,我现在在
视图中将出现一个标志:
表示有一个挂起的滚动,然后在
viewdilayoutsubviews
中,如果设置了该标志,我将调用
scrollToRowatinexpath:animated
并取消设置该标志(因为该方法被多次调用)。这是完美的


希望这能帮助其他遇到这个问题的人。

当用户点击后退按钮时,当我滚动到
表格视图的特定行时,我注意到了相同的错误。我注意到表视图的
contentInset
在导航过程中发生了变化(由于
automaticallyAdjustsScrollViewInsets=true
)。我找到的唯一解决方案是添加一个观察者:

tableView.addObserver(self, forKeyPath: "contentInset", options: .new, context: nil)

并在
contentInset
建立后执行
scrollToRow
方法。这不是一个漂亮的解决方案,但它很有效。

您的表视图的框架是什么,其内容插入是什么?我会检查。但正如我所说,我不是在操纵这些;我刚刚将一个UITableViewController从调色板拖到IB中的画布上。你能手动滚动到最后一个单元格并完整查看它吗?@mharper我当然能。另外,如果我轻弹表格视图,使其滚动到最底部,当它完成反弹并停止时,最后一行完全在视图中。您何时滚动到底部?你确定要滚动到最后一行吗?请显示一些代码。添加此属性是因为在iOS 7上,视图会自动扩展到导航和工具栏下,这就是我想要的行为。scroll方法在其内部实现中应该考虑到这一点。我认为这个属性不会对其产生太大影响。在我的例子中,它只将scrollView插入移动了20磅,这是状态栏的大小,而不是导航或工具栏。从iOS 11开始就不推荐使用,现在很可能是
scrollView.contentInsetAdjustmentBehavior=.automatic
如果以前是,它实际上对我也没有帮助。这解决了我的问题!谢谢我被迫使用手动偏移量计算,因为iOS7已经发布了,直到今天我才看到这个!!但愿我早一点读过这篇文章!谢谢很好的建议,但对我不起作用。我正在一个单独的线程中加载数据。加载数据后,我调用
[mytableView重新加载]
。这确实调用了
viewdilayoutsubviews
。仍在寻找解决方案-不想手动调整。为我工作,但必须调整到
[self.tableView setContentOffset:(CGPoint){0,self.tableView.contentSize.height}动画:是]