与 UITableView 的超级视图上的 UIPanGestureRecognizer 冲突

Posted

技术标签:

【中文标题】与 UITableView 的超级视图上的 UIPanGestureRecognizer 冲突【英文标题】:Conflict with a UIPanGestureRecognizer on a UITableView's superview 【发布时间】:2018-08-25 16:23:22 【问题描述】:

我正在尝试构建与 ios 上 Apple 地图中的抽屉菜单大致相似的东西。

在这个Xcode project 中,我在VC 的视图上附加了一个UIPanGestureRecognizer,当平移发生时,垂直移动一个UITableView 并禁用滚动。

问题是每次平底锅结束后,didSelectRow 方法仅在UITableView 某处发生第二次点击后才会调用。我当然希望在第一次点击后调用它。

有趣的是,如果我启用表格的滚动,并且在手势识别器的委托中有 shouldRecognizeSimultaneouslyWith 返回 true,则该错误不会发生。

如果您尝试将手指放在抽屉内列表中的最近位置条目上,尝试向上拉抽屉,则其他有趣的事情似乎发生在 Apple Maps 本身中。

感谢您的帮助!

【问题讨论】:

【参考方案1】:

我不太明白你在说什么。 但我认为主要问题在于“Chain Responder”。当您在响应者链中使用PanGestureRecognizerUITableView属性isScrollEnable = false时,PanGestureRecognizer是第一个被调用的人,系统等待失败或事件未处理,然后将其传递给响应者链中的下一个,即UITableView。因此,调用didSelectRow 函数需要很长时间 我建议你创建一个新的UIView 并将ViewController 插入到故事板或笔尖中,并将UITableVIew 放在UIView 之外,然后将PanGestureRecognizer 链接到新的UIView。这样,响应者链就不会与两者发生冲突,因为系统可以检测到阻力何时在新的UIView 中并仅调用PanGestureRecognizer,而当它在UITableView 中时将调用didSelectRow

最好的问候 不解决就写

【讨论】:

以上是关于与 UITableView 的超级视图上的 UIPanGestureRecognizer 冲突的主要内容,如果未能解决你的问题,请参考以下文章

检测 UITableView 的超级视图中的触摸,如果反弹不是 = 否,它会反弹

将页脚保持在 UITableView 超级视图的底部,直到 tableViewStarts 滚动

UITableView 的子视图与 tableView 的高度不同

NSLayoutConstraint 用于 UITableView 上的视图

UITableView 跟踪触摸错误的轴

使用情节提要在 UItableview 上浮动按钮