使用 UITableView 的奇怪滚动问题

Posted

技术标签:

【中文标题】使用 UITableView 的奇怪滚动问题【英文标题】:Weird Scrolling Issue Using UITableView 【发布时间】:2010-01-19 05:35:14 【问题描述】:

我是一个正在工作的 UINavigationController 将两个不同的 UITableView 推入和推下堆栈。我的所有功能都正常工作,除了滚动。当任一表格滚动到顶行上方或底行下方时,它会停留在那里,暴露表格上方/下方的边距。我正在寻找能够“反弹”回来的表格,以便只有表格可见,而不是超出范围的空白区域 - 就像任何其他 iPhone 应用程序一样。

我的一个 UITableViews 正在由 NIB 加载,另一个正在以编程方式创建 - 两者的结果完全相同。我已经尝试了 Nib 中的所有弹跳和滚动设置,但似乎没有任何效果。

谁能告诉我我做错了什么?如果我可以更具体地详细说明我的问题,请告诉我。

谢谢,

-斯科特

我想添加更多信息,因为我仍然无法弄清楚这个问题。我应该指出,我尝试将此 NavigationController 添加到的应用程序不是主视图。我有一个使用 Nib 加载的 SettingsViewController。在该控制器中,我想创建一组基于导航的新视图。所以从我的 SettingsViewController 内部,如果用户点击一个按钮,我...

在我的按钮选择器中:


TextListViewController *controller = [[TextListViewController alloc] initWithStyle:UITableViewStylePlain];

controller.title = @"Test Table View"; navController = [[UINavigationController alloc] initWithRootViewController:controller]; navController.modalTransitionStyle = UIModalTransitionStyleCoverVertical; [self presentModalViewController:navController animated:YES]; [controller release];

上面的代码在除滚动之外的所有方面都能完美运行。我能够处理所有委托方法并将新控制器推送到堆栈上。我遇到的唯一问题是根控制器(以及所有其他推送的控制器)将无法正确滚动。

在任何情况下,它都允许我滚动过去表格的顶部和底部,并且不会像应有的那样快速返回。当您轻弹滚动时,它也没有随心所欲的感觉。相反,无论您滚动多快,只要您移开手指,它就会停止。很奇怪。

我尝试使用 Navigation 模板创建另一个项目 - 当然它工作正常 - 但模板假定 NavigationController 的视图一直附加 - 这不是我的情况。我在标准 ViewController 中即时创建所有这些。

感谢凯文的帮助,但我仍然在这里寻求帮助。

谢谢,

【问题讨论】:

【参考方案1】:

好吧,我解决了这个问题,它与我如何将 UITableView 添加到 UINavigationController 或我如何实例化视图无关。事实证明它与任何一个都完全无关。

我正在使用紧凑的 while 循环来处理我的游戏循环。我需要一种方法来处理循环中的操作系统消息,以防止触摸和其他事件被阻止。这是我在循环中间使用的:


while(CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.002, TRUE) == kCFRunLoopRunHandledSource);

直到出现这个滚动问题,我对这个实现完全没有任何问题。无论出于何种原因,这都会破坏 UITableView 的滚动功能。

我更改了我的游戏循环,因此不需要上面的代码,一切都开始工作了。

谢谢...

【讨论】:

在默认模式下运行自定义 NSRunLoop 时,我遇到了同样的情况。重构我的代码不需要修复问题,我的表格视图现在可以在模态显示的 UINavigationController 中正确滚动。谢谢! 您知道为什么这可能是一个问题吗?我遇到了同样的问题,但我认为我无法通过重构来解决。【参考方案2】:

您的UITableViewUIScrollView,其属性bounces 是关键。这是reference。不过,默认情况下它是YES。你检查过这个吗?

【讨论】:

是的,我检查过了,它设置为是。文档还说该属性,如果设置为 NO,将不允许视图滚动到内容的末尾。就我而言,它在两个方向上滚动过去。这可能与我的 UITableView 连接到 UINavigationController 的事实有关吗?谢谢... 我忘了说,滚动 20 多个项目的列表时,滚动不流畅。通常,当您快速向下移动手指并将其从屏幕上移开时,滚动会继续几行。就我而言,无论我滚动多快,在移开手指后滚动都会立即停止。有什么想法吗?【参考方案3】:

您的问题和 cmets 似乎建议您以某种方式将 UITableView 附加到您的 UINavigationController,而不是通过推送 UITableViewController。如果你不这样做,你真的应该这样做。

一般来说,如果您可以将子视图控制器推送到UINavigationController,那么您也可以单独使用子视图控制器来测试它。尝试将您的UITableViewController 视图设为窗口的根视图,看看是否符合您的预期。这样您就可以将问题隔离到表格视图部分或导航部分。

【讨论】:

Kevin,我正在创建一个 UINavigationController 并使用 Nav 的 initWithRootViewController 附加一个 UITableViewController。 TextListViewController *controller = [[TextListViewController alloc] initWithNibName:@"TextListViewController" bundle:nil]; controller.title = @"标题文本"; navController = [[UINavigationController alloc] initWithRootViewController:controller]; navController.modalTransitionStyle = UIModalTransitionStyleCoverVertical; [self sesentModalViewController:navController 动画:YES]; [控制器释放];它是否正确?感谢您的帮助。 哇,太丑了。不知道如何在这个论坛上以可读的格式向您展示代码。感谢您的任何帮助,您可以提供。 -斯科特 嗯。它看起来对我来说是正确的......尝试使用导航/表格视图模板与新项目进行比较。它应该基本上完成您想要完成的工作。【参考方案4】:

我遇到了和你一样的问题,正如你上面所说的,这与你调用 runloop 的方式有关:

while(CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.002, TRUE) == kCFRunLoopRunHandledSource);

似乎 DefaultMode 是错误的等待方式,我将代码更改为等待 UITrackingRunLoopMode 并且 TableView 工作正常。就我而言,我使用:

[[NSRunLoop currentRunLoop] runMode:UITrackingRunLoopMode beforeDate:[NSDate distantFuture]];

一切正常。

【讨论】:

以上是关于使用 UITableView 的奇怪滚动问题的主要内容,如果未能解决你的问题,请参考以下文章

未分配给父 UIViewController 视图属性时,UITableView 不滚动

UITableView - reloadRows 方法创建奇怪的滚动错误

滚动 UITableView 的奇怪行为

UITableView 滚动时奇怪的布局行为变化

水平滚动 UITableView 的奇怪行为(在 Monotouch 中)

滚动过去的内容边界时,防止 UITableView 的部分标题做奇怪的事情吗?