【问题标题】:iOS UITableView is not scrolling after adding cells添加单元格后iOS UITableView不滚动
【发布时间】:2013-08-03 01:53:33
【问题描述】:

我有一个 UITableView 代表游戏中的可玩回合。在第一次启动时,tableView 中只显示了两个单元格。随着用户通过关卡,越来越多的行被添加到 tableView。每次显示 tableView 时我都会重新加载数据(每次用户通过关卡时都会发生这种情况)。

一旦 tableView 包含足够的需要滚动的单元格,tableView 将不会滚动以及用户离开它的位置。它会滚动显示单元格在下方,但是当用户松开手指时,tableView 会弹回,不允许用户与需要滚动查看的单元格进行交互。完成另一个关卡并返回 tableView 后,视图将正常滚动。

当存在滚动问题时,好像 tableView 没有意识到它足够大以至于需要滚动,所以它会弹回原来的位置,尽管事实上当下面有单元格显示时用户尝试滚动。

我没有在 tableView 的委托中实现 heightForRowAtIndexPath 或 heightForHeaderInSection 方法,因此不应该产生干扰。我已经在这个网站和谷歌上搜索过类似的问题,并尝试了一些方法,包括设置 contentSize,但都没有成功。

没有滚动有什么原因吗?或者,更重要的是,有没有办法解决它?谢谢!

编辑: 我看到一些 cmets 询问框架。我在我所在的视图的 viewDidAppear 方法中记录了表格所在视图的框架、tableView 本身的框架以及 tableView 的内容大小。

这是在需要滚动之前出现视图时的结果。滚动行为符合预期;用户可以滚动到可见区域,然后它会弹回来。

view.frame: {{0, 20}, {320, 460}}
tableView.frame: {{0, 145}, {320, 315}}
tableView.contentSize: {320, 308}

以下是当需要滚动视图时出现的结果。滚动将允许出现下面的单元格,但是当用户松开手指时,它会在不应该的时候弹回。

view.frame: {{0, 20}, {320, 460}}
tableView.frame: {{0, 145}, {320, 315}}
tableView.contentSize: {320, 352}

请注意,contentSize.height 确实更改了 44,因为它应该在添加新单元格后更改。 contentSize.height 现在比 tableView.frame.height 大,但滚动行为并没有反映这一点。

【问题讨论】:

  • 请发布一些代码。你在某处编辑表格视图的框架吗?还是使用 tableView 的 contentInset?
  • 我正在使用自动布局并且没有设置框架。我没有设置 tableView 的 contentInset。我认为代码中没有发生任何特殊情况会导致这种情况,或者我可以发布的任何代码都会有用。我正在实现普通的委托方法。我在 IB 中布置 tableView。我无法想象任何 IB 约束会导致这样的滚动问题。
  • 请发布代码 - 否则任何人几乎都不可能对您的问题给出有意义的答案。
  • 在重新加载数据的位置设置断点,并在 Xcode lldb/gdb 控制台中执行 po <your table view variable name>。这将告诉您 tableview 的框架是什么,这将帮助我们找出您的问题。
  • 我认为您的 tableView 框架 y 尺寸大于您的视图框架 y 尺寸。

标签: iphone ios ipad uitableview


【解决方案1】:

UITableViewDelegate 协议符合 UIScrollViewDelegate,因此您只需在 UITableViewDelegate 实现中直接实现方法 -scrollViewWillBeginDragging 和 -scrollViewDidScroll ,如果实现类设置为 UITableView 的委托,它们将被自动调用。

因此,在这些方法中,您可以实现与显示 tableView 内容相关的逻辑。就像您在滚动时说的那样,它应该显示新的单元格,即当时最上面的单元格必须隐藏。您可以将上述方法中的逻辑编写为,

//set your content of tableview to show new cell each time.

或滚动方向,你有方法 - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView,

// you can set here start and end coordinates and change them accordingly when scroll decelerates.

以这种方式编写代码不会使滚动反弹。你会得到完美的结果。 希望这会有所帮助。

【讨论】:

    【解决方案2】:
     self.tableview.scrollEnable=YES;//Paste this line where initialized UITableView.
    

    【讨论】:

    • 这显然是错误的,因为 OP 正在滚动,但还不够。
    • 那么问题肯定出在 UITableView 框架上,这将大于 View..这就是为什么某些单元格不可见 ....所以正确设置 UITableView 框架。
    • @h.kishan 感谢您的回答。我确实试了一下,但没有成功。我还在问题的编辑中记录了 UITableView 的框架。
    • //做这个 tableView.frame: {{0, 145}, {320, 215}}//这肯定会帮助你
    • 我不知道为什么会有帮助。我使用的是自动布局,所以设置 tableView 的框架不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多