使用 UIPanrecognizer 的自定义视图无意中锁定了 UITableViewController

Custom views with UIPanrecognizer unintendetly locks UITableViewController

我想在 UITableViewCell 中放置自定义视图(从 nib 创建)。这没有问题,除非自定义视图声明它自己的单点触摸 UIPanrecognizer。在那些情况下,我的自定义视图响应平移事件,但这几乎禁用了在 table 视图内滚动单元格的能力。我尝试在单元格和自定义视图中注册 UIPanRecognizer,但自 IOS 9 以来似乎不再允许使用该功能(似乎这也不是 Apple 希望处理触摸事件的方式,我在某处读到触摸事件应该只由一个视图处理)

我也未能找到以编程方式滚动 table 视图的方法,这看起来也有点老套。

如果想要保留 UITableView 的平移行为,同时仍然能够响应自定义视图中的平移事件,我有哪些选择?

我的用例如下:我想重用我为应用程序的另一部分创建的可以横向滚动的自定义视图。我的 table 视图设置为仅对向下平移作出反应。因此两个平移动作没有干扰。

目前我解决的两种方法如下: 横向滚动对双指平移有反应。这是超级笨拙和不直观的。

自定义视图上的所有手势(点击除外)都会发送到其父视图。点击自定义视图会禁用重新路由,从而锁定 table 视图并通过让自定义视图对横向平移做出反应来启用横向滚动。另一个点击恢复初始行为。这很尴尬,因为它要求用户执行三个单独的操作,而实际上应该只是一个操作。

我知道我可以为 table 视图启用横向平移,但这并不能解决我想在单元格内重用自定义视图的问题。

有谁知道解决这个难题的方法吗?

解决方案是创建自定义 UIGestureRecognizer

我遵循 this tutorial,创建了一个自定义 SidewaysPanGestureRecognizer,注册了它并通过实施负责决定的 UIGestureRecognizerDelegate 方法将所有手势传递给超级视图,但 SidewaysPanGestureRecognizer如果视图应该处理手势:

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, 
     shouldReceiveTouch touch: UITouch) -> Bool {
    return gestureRecognizer is SidewaysPanGestureRecognizer
}