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:
并返回相同的值也没有帮助
是否有任何方法可以使表格视图滚动到最后一行并使其完全可见
编辑:
为了清楚起见,我使用了一个stockUINavigationController
和一个stockUITableViewController
作为根视图控制器
编辑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}动画:是]你能解释一下你所说的低级函数是什么意思吗?你是说标准卷轴不可靠吗?