0

我是 iOS 开发和 Swift 的新手,遇到以下问题:

我想从屏幕上捕捉触摸事件。我对常规视图执行此操作没有任何问题。不幸的是,我遇到了该UIScrollView组件的问题。当用户点击屏幕、长按屏幕或水平移动手指时,我可以捕捉触摸,但是当用户垂直移动手指并同时激活垂直滚动时,我无法捕捉到触摸捕捉倒数

我在 StackOverflow 上发现了一些关于类似问题的线程,但那里提供的解决方案并没有解决我的问题。

我的观点结构如下:

+- View (top-level view)
   |
   |
   +--- UIScrollView
        |
        |
        +-- other views inside...

这是我的代码:

class MyViewController : UIViewController {
  @IBOutlet weak var scrollView: UIScrollView!

  override func viewDidLoad() {
    super.viewDidLoad()
    view.addGestureRecognizer(myRecognizer)
  }
}

手势识别器被添加到顶层视图中。

我也有基本的自定义实现UIGestureRecognizer

class MyRecognizer: UIGestureRecognizer {
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
        super.touchesBegan(touches, with: event)
        // handle events...
    }
    
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent) {
        super.touchesMoved(touches, with: event)
        // handle events...
    }

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent) {
        super.touchesEnded(touches, with: event)
        // handle events...
    }
}

我尝试做些什么来解决这个问题?

  • 设置参数scrollView.canCancelContentTouches = false- 没有帮助
  • 设置参数scrollView.isScrollEnabled = false- 我能够捕获所有触摸事件,但 scrollView 停止工作 - 没有帮助
  • 将手势识别器添加到 scrollView 并将其从顶级视图中删除 - 没有帮助
  • 将手势识别器添加到滚动视图和顶级视图 - 没有帮助
  • 设置参数scrollView.isUserInteractionEnabled = false- 我能够捕获所有触摸事件,但 scrollView 和所有 UI 组件停止工作 - 没有帮助
  • 重新排序MyRecognizer类中的调用:首先处理事件,然后从上层类调用方法super.touches...- 没有帮助

现在,我不知道UIScrollView在用户垂直滚动屏幕时我还能做些什么来捕获触摸事件。

任何建议或帮助表示赞赏!

问候,

彼得

4

1 回答 1

1

所以 UIScrollView 有自己的一组手势,cancelsTouchesInView默认设置为 true。尝试将此属性设置false为滚动视图中的每个手势,如下所示:

for gesture in scrollView.gestureRecognizers ?? [] {
    gesture.cancelsTouchesInView = false
}

编辑

这个问题的解决方案是创建一个单独的自定义UIScrollView并在其中捕获触摸。在此线程中有详细描述:https ://stackoverflow.com/a/70594220/10953499 (也在评论中链接)。

于 2022-01-28T03:04:18.280 回答