嵌套的UITableViews:同时滚动外部垂直UITableView和子水平UITableView的方法?

时间:2011-04-12 11:49:42

标签: iphone ipad uitableview nested uitouch

当您使用非典型嵌套UITableViews设置时 - 您有一个外部垂直UITableView,它承载90°旋转的UITableViews(请参阅:Looking for a UI library to present Data horizontaly in iOS): 有没有办法让iOS进程同时垂直水平触摸

我发现iOS在处理触摸时非常聪明: 水平触摸使相关的水平UITableView滚动,而垂直滑动使外部UITableView滚动。完美。

只有,我希望能够对角地移动我的手指并同时看到外部UITableView 内部UITableView滚动。

我尝试了一些方法(使用canCancelContentTouches,delayedContentTouches和touch消息),但我还没有找到办法让这种情况发生。

编辑: 这是一个显示此行为的XCode4项目:http://marcanton.io/other/stackoverflow/nestedtableviews.zip

编辑: 我将此问题提交给Apple Developer Technical Support,这是他们的回复:

  

感谢您写信给Apple   全球开发者技术支持。   我正在回复你的询问   关于嵌入式触摸事件   UITableViews。

     

通常这是一种方法   不建议。问题是   UITableView继承自UIScrollView   并且如文件中所述   的UIScrollView:

     

“重要:你不应该嵌入   UIWebView或UITableView对象   UIScrollView对象。如果你这样做,   可能导致意外行为,因为   两个对象的触摸事件可以   混淆和错误处理。“

     

http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIScrollView_Class/Reference/UIScrollView.html%23//apple_ref/occ/cl/UIScrollView

     

所以这次,没有   让两者都滚动的解决方法   在同一时间。

     

我建议您提交   增强请求   http://developer.apple.com/bugreporter/   详细说明您希望看到的内容   我们在将来的版本中添加。

尽管如此,我认为必须有一种方法来启用此功能,但我知道不建议这样做。事实上,Apple甚至不建议在另一个UITableView中托管UITableViews,但除了上面提到的例外,它的工作非常精彩。 我将通过我们的集体调查结果更新此问题。

编辑:实际上有一种方法,详见:http://marcanton.io/blog/nested-orthogonal-tableviews/

2 个答案:

答案 0 :(得分:1)

有趣的是,我还没有玩过这种设置,但是我会尝试拦截嵌套UITableViews上的触摸事件,并将任何垂直移动委托给外部UITableView - 反之亦然。

答案 1 :(得分:1)

这必须是截取的触摸事件的自定义镜像。触摸事件遵循responder chain model,这意味着如果响应者链中的对象(最顶层(最外层)视图)无法处理事件或操作,它会将消息重新发送给下一个响应者(在本例中为后台)链中的UITableView)。这就是为什么您看到水平事件转到水平UITableView而垂直事件转到垂直UITableView。对角线触摸事件具有适用的水平和垂直事件,因此最顶部的视图(外部垂直UITableView)可以响应垂直触摸并吞下事件。

如果您考虑一下,所有垂直触摸都可能会有一些水平事件(想想当您轻弹手指时),因此可能会在后台完成一些工作以确定如何解释触摸事件(或者作为垂直或水平)。

我发现这个tread将事件传递给响应者链中的下一个对象。您可能想尝试将此作为您拼图的部分解决方案。其余的是弄清楚如何捕获水平触摸事件并将它们传递给下一个响应者。