与 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”。当您在响应者链中使用PanGestureRecognizer
和UITableView
属性isScrollEnable = false
时,PanGestureRecognizer
是第一个被调用的人,系统等待失败或事件未处理,然后将其传递给响应者链中的下一个,即UITableView
。因此,调用didSelectRow
函数需要很长时间
我建议你创建一个新的UIView
并将ViewController
插入到故事板或笔尖中,并将UITableVIew
放在UIView
之外,然后将PanGestureRecognizer
链接到新的UIView
。这样,响应者链就不会与两者发生冲突,因为系统可以检测到阻力何时在新的UIView
中并仅调用PanGestureRecognizer
,而当它在UITableView
中时将调用didSelectRow
最好的问候 不解决就写
【讨论】:
以上是关于与 UITableView 的超级视图上的 UIPanGestureRecognizer 冲突的主要内容,如果未能解决你的问题,请参考以下文章
检测 UITableView 的超级视图中的触摸,如果反弹不是 = 否,它会反弹
将页脚保持在 UITableView 超级视图的底部,直到 tableViewStarts 滚动
UITableView 的子视图与 tableView 的高度不同