gpt4 book ai didi

ios - 处理多个 View 的 UIPanGestureRecognizer 手势(一个覆盖另一个)

转载 作者:搜寻专家 更新时间:2023-11-01 07:33:24 24 4
gpt4 key购买 nike

抱歉问了这么长的问题,但我觉得我应该传达我的尝试。

我有意见viewA在导航 Controller 中。然后我添加一个 subview viewB (包含 UITableView )到 viewA并偏移其原点高度,使其仅覆盖屏幕的一半(另一半从屏幕底部溢出)。我希望能够然后拖动此 viewB向上但是当它碰到导航栏的底部时它会停止,并且当它碰到原点偏移点时向下拖动时也会停止。这是我成功实现的。

但是,我想要 UITableView交互仅在 viewB 时启用处于其上部位置,因此不会响应任何其他位置的手势。本质上,拖动 viewB向上,使其完全覆盖 viewA应该启用与 UITableView 的交互.

这里棘手的部分是我希望它执行以下操作:

  • viewB UITableView 处于其上方位置以覆盖屏幕内容偏移量为 0(即我们在表格顶部)并且用户向下平移手势,该手势不应与 UITableView 交互。但应该搬家viewB向下。
  • 上述条件下的任何其他平移手势都应该是与 UITableView 的交互。 .
  • viewB UITableView 处于其上方位置以覆盖屏幕内容偏移量是 不是 在 0(即我们是 不是 在表格顶部)并且用户向下平移手势时,该手势应该与 UITableView 交互.

  • 我已经非常接近实现这一目标,但我不能完全正确。

    迄今为止的尝试

    我正在使用 UIPanGestureRecognizer处理 View 的拖动。我尝试将其添加到:
  • viewBUITableView用户交互最初被禁用。这允许我拖动 viewB上下不干扰UITableView .曾经viewB位于上方位置我启用 UITableView用户交互然后正确地允许我与 UITableView 交互不动viewB .

    但是,通过启用 UITableView用户交互,这意味着触摸永远不会到达 UIPanGestureRecognizer ,这意味着我永远无法检测到上述第 (1.) 点中描述的场景,因此无法重新禁用 UITableView用户互动制作 viewB再次移动。

    也许可以通过覆盖 UITableView 使用的手势识别方法来做到这一点。 ?如果这是可能的,任何人都可以指出我正确的方向吗?
  • UITableView 前面添加了一个新 View .我想也许我可以将触摸手势转发到 UITableView必要时支持它,但我仍然没有找到方法来做到这一点。

    我所能做的就是禁用手势识别器,它允许我与 UITableView 进行交互。 ,但后来我遇到了与上述相同的问题。我无法检测何时重新启用它。
  • UITableViewviewB .这似乎是迄今为止最有希望的方式。通过设置以下方法的返回值,我可以启用和禁用 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 方法(我已经检查过打印语句),然后调用 bottom 方法。通过对 2 种方法进行不同的真/假组合,我可以在 viewB 之间交替交互。和 UITableView .

    为了检测用户是否正在向下滑动,我调用 velocityInView()在识别器上(如底部方法所示)。我打算在顶级方法中进行此检查 if声明,但我认为这会起作用,尽管 velocityInView()在底部方法中工作正常,在顶部方法中不起作用(速度始终为 0)。

  • 我已经搜索了一些解决方案,并找到了许多关于相互覆盖的 View 的手势处理的类似查询,但这些似乎都是关于一种手势类型,例如捏,在一个 View 上,和另一种类型,例如平底锅,另一方面。就我而言,两者的手势类型相同。

    也许有人有一个聪明的主意?或者,也许这实际上很简单,而我却把它变得非常复杂? xD

    最佳答案

    设法让这个工作。

    在我上面的问题中描述的方法中,我删除了最重要的方法,只保留了这个(它有一些变化):

    func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    if ((gestureRecognizer as! UIPanGestureRecognizer).velocityInView(view).y < 0
    || pulloverVC.tableView.contentOffset.y > 0)
    && pulloverVC.view.frame.origin.y == bottomNavbarY {
    return true // enable tableview control
    }
    return false
    }

    if 语句检查覆盖 UITableView处于上位 要么用户没有向下拖动 表格内容是偏移的(我们不在表格的顶部)。如果这是真的,那么我们 return true启用表 View 。

    调用此方法后,将调用为处理我的平移手势而实现的标准方法。在这里,我有一个 if 语句,用于检查与上述相反的情况,如果这是真的,它会阻止对覆盖 viewB 的控制。从移动:
    func handlePanGesture(recognizer: UIPanGestureRecognizer) {

    let gestureIsDraggingFromTopToBottom = (recognizer.velocityInView(view).y > 0)

    if pulloverVC.view.frame.origin.y != bottomNavbarY || (pulloverVC.view.frame.origin.y == bottomNavbarY && gestureIsDraggingFromTopToBottom && pulloverVC.tableView.contentOffset.y == 0) {

    ...

    这现在保留了 UITableView交互关闭,除非其父 View viewB处于正确位置,当它处于正确位置时,将禁用 viewB 的移动以便只与 UITableView互 Action 品。

    然后,当我们位于表格顶部时,向下拖动,与 UITableView 交互。被重新禁用并与其父 View 交互 viewB重新启用。

    一个冗长的帖子和答案,但如果有人能理解我在说什么,希望它会帮助你。

    关于ios - 处理多个 View 的 UIPanGestureRecognizer 手势(一个覆盖另一个),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31348739/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com