【发布时间】:2015-07-11 21:36:56
【问题描述】:
很抱歉问了这么长的问题,但我觉得我应该传达我的尝试。
我在导航控制器中有一个视图viewA。然后,我将一个子视图viewB(包含UITableView)添加到viewA,并偏移其原始高度,使其仅覆盖屏幕的一半(另一半溢出屏幕底部)。然后我希望能够向上拖动这个viewB,但是当它到达导航栏的底部时它会停止,并且当它到达原点偏移点时同样会停止。我已经成功实现了这一点。
但是,我希望 UITableView 交互仅在 viewB 位于其上方位置时启用,因此不会响应任何其他位置的手势。本质上,向上拖动viewB 使其完全覆盖viewA 应该能够与UITableView 交互。
这里的棘手部分是我希望它执行以下操作:
- 如果
viewB位于其上方位置以覆盖屏幕,则UITableView内容偏移量为0(即我们位于表格顶部)并且用户做出向下平移手势,手势不应与UITableView交互,但应向下移动viewB。 - 上述条件下的任何其他平移手势都应该是与
UITableView的交互。 - 如果
viewB位于其上方以覆盖屏幕,则UITableView内容偏移量为 NOT 为 0(即我们是 NOT表顶部)并且用户做出向下平移手势,该手势应与UITableView交互。
我已经非常接近实现这一目标,但我无法做到完全正确。
目前的尝试
我正在使用UIPanGestureRecognizer 来处理视图的拖动。我已尝试将其添加到:
-
viewB最初禁用了UITableView用户交互。这让我可以在不干扰UITableView的情况下上下拖动viewB。一旦viewB位于其上方位置,我将启用UITableView用户交互,然后正确地允许我与UITableView交互而无需移动viewB。但是,通过启用
UITableView用户交互,这意味着触摸永远不会到达UIPanGestureRecognizer,这意味着我永远无法检测到上面第 (1.) 点中描述的场景,因此无法重新禁用UITableView用户交互使viewB再次可移动。也许可以通过覆盖
UITableView使用的手势识别方法来做到这一点?如果这是可能的,谁能指出我正确的方向? -
在
UITableView前面添加了一个新视图。我想也许我可以在必要时将触摸手势转发到它后面的UITableView,但我仍然没有找到这样做的方法。我所能做的就是禁用允许我与
UITableView交互的手势识别器,但是我遇到了与上述相同的问题。我无法检测到何时重新启用它。 -
viewB中的UITableView。这似乎是迄今为止最有希望的方式。通过设置以下方法的返回值,我可以启用和禁用viewB和UITableView的识别。func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool { if pulloverVC.view.frame.origin.y == bottomNavbarY && pulloverVC.tableView?.contentOffset.y == 0 { // need to add gesture direction check to this condition viewBisAtTop = true return false // disable pullover control } return true // enable pullover control } func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool { if (gestureRecognizer as! UIPanGestureRecognizer).velocityInView(view).y < 0 && viewBisAtTop { // gesture direction check not wanted here return true // enable tableview control } viewBisAtTop = false return false // disable tableview control }做出手势时首先调用 top 方法(我已经检查了 print 语句),然后调用 bottom 方法。通过为这两种方法制作不同的真/假组合,我可以在
viewB和UITableView之间交替交互。为了检测用户是否向下滑动,我在识别器上调用
velocityInView()(如底部方法所示)。我打算在顶部方法if语句中进行此检查,我认为这会起作用,但是,尽管velocityInView()在底部方法中工作正常,但在顶部方法中却没有(速度始终为 0)。
我已经搜索了一些解决方案并找到了许多关于手势处理的类似查询,但这些查询似乎都与一种手势类型有关,例如捏,在一个视图和另一种类型,例如潘,另一方面。就我而言,两者的手势类型相同。
也许有人有一个聪明的主意?或者也许这实际上很简单,而我把它弄得非常复杂? xD
【问题讨论】:
标签: ios swift uitableview uigesturerecognizer uipangesturerecognizer