9

UITableView有一堆可重复使用的单元格,当我点击其中一个时,它会将我带到另一个视图控制器(通过 push segue),显示该单元格的详细信息(假设它是一个项目,因此它会显示有关项目的详细信息- 名称、价格、图片等...)。当我弹出该视图控制器(通过点击后退按钮)时,它UITableView有一个奇怪的行为:

a) 如果它一直滚动到底部,它会自动滚动一点点(大约 50 点),最后一个单元格几乎不可见,所以我必须再次向下滚动。我的牢房都有 60 分的高度。

b)滚动条总是显示然后消失,表明有东西在移动UITableView(虽然如果不滚动到底部,内容不会自动移动)。

这发生在UITableView我的应用程序中的多个中。我没有强制在 viewWillAppear 中重新加载表格视图,所以我不明白发生了什么。从服务器加载后我的内容是静态的(除非用户更改它,然后执行重新加载)。但简单地显示项目的详细信息并弹出该 VC 并不会改变表视图​​中的任何内容。

编辑:好的,我已经知道问题出在哪里:我UIToolbar在推动那个 segue 时隐藏了一个。如果我保持它始终可见(这是我不想要的),它仍然会在我的表格视图中弹出时显示滚动条动画,但如果在最后几行则不会滚动表格视图。

4

6 回答 6

7

将以下内容添加到 viewDidLoad。

self.automaticallyAdjustsScrollViewInsets = NO;

这解决了我导航回视图控制器后表格视图向下移动的问题。

于 2015-03-02T05:09:14.837 回答
3

我设法解决了第一个问题。似乎 tableview 没有考虑到UIToolbar.

将 tableview 偏移量保存在prepareForSegue:(保存在CGPoint属性中)

self.tableViewScrollOffset = self.tableView.contentOffset;

然后,在 中viewWillAppear:,检查它是否已被修改。如果是这样,请恢复它。

if(self.tableView.contentOffset.y != self.tableViewScrollOffset.y) {
        [self.tableView setContentOffset:self.tableViewScrollOffset];
        self.tableViewScrollOffset = CGPointZero;
    }
于 2013-07-12T16:14:35.213 回答
3

这种行为确实是 iOS 8.x 中的一个错误。

到目前为止给出的所有答案都不能真正解决问题。问题是,iOS 忘记(或不考虑)之前计算的单元格大小,当重绘表格时,例如当视图被推送时。

可以在此处找到解决此问题的一种方法:UITableView layout messing up on push segue and return。(iOS 8,Xcode beta 5,Swift)(所以这个问题甚至与这个问题重复)。

但是,提供的解决方案有点矫枉过正,并且在某些情况下此缓存会失败(例如不考虑 UIContentSizeCategoryDidChangeNotification)

但是有一个非常简单的解决方案,即使它很奇怪:

如果您使用的是手册,只需performSequeWithIdentifierdidSelectRowAtIndexPath前面添加一个[self.tableView reloadData]

如果您使用的是单元格中的 IB 序列,只需添加[self.tableView reloadData]您的prepareForSeque代码。

解决问题的原因是,这将迫使 iOS 重新估计可见单元格,因此它不再将内容滚动到另一个位置。幸运的是,tableView reloadData这里不会花费太多开销,因为只会重新估计可见单元格。

于 2015-03-21T11:03:07.377 回答
0

只是预感,你scrollToRowAtIndexPath:atScrollPosition:animated身边有流氓吗?

于 2013-07-12T15:16:29.670 回答
0

如上所述设置 automaticAdjustsScrollViewInsets 不起作用,缓存和设置 tableViewScrollOffset 也不起作用。

因此想出了一个解决方法,它对我来说就像一个魅力。

解决方法是添加一个高度为 1 像素、宽度为 320 像素的虚拟 UIView,并将其放在“顶部布局指南”和 UITableView 之间。可以将此视图的背景设置为清除,使其不可见。

现在使用自动布局,将虚拟视图的顶部固定到顶部。现在设置 tableview 相对于 Dummy View 的顶部约束。发现这样解决了tableview错位的问题。

提供了虚拟视图的屏幕截图以及自动布局约束,以便于参考。虚拟视图已设置为更大的高度和红色背景色,仅用于说明目的。

在此处输入图像描述

于 2017-10-24T13:29:17.767 回答
0

我也面临这个问题。我设法找到了。就我而言,原因是 tableview 标题高度是基于文本计算的,而文本高度是负数,因为即使 contentinset 和 scrollinset 为零,tableview 也会向下移动。

这只是第一次发生。下次它计算正确。我发现的一件奇怪的事情是,当 A 类(具有 tableview)从 init 推送另一个 B 类时。当 B 类的键盘打开时,A 类的 viewDidLoad 会被调用。在从导航控制器卸载 B 类之前。为 A 类重新加载 Tableview。

于 2016-02-05T14:59:34.297 回答