让 UIScrollView 放弃 UITouch

Posted

技术标签:

【中文标题】让 UIScrollView 放弃 UITouch【英文标题】:Make UIScrollView give up UITouch 【发布时间】:2017-10-22 00:45:53 【问题描述】:

我有一个绘图应用程序,其画布大于手机屏幕的大小。我想用两根手指实现滚动并用一根手指绘图。到目前为止,我可以使滚动工作正常,但是当涉及到绘图时,线条开始,然后绘图的视图失去了对触摸的控制,因此只绘制了线条的第一部分。我认为滚动视图收回了控制权。点可以画得很好。

这是我的子类 UIScrollView

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) 
    guard let touches = event?.touches(for: self) else  return 
    if touches.count < 2 
        self.next?.touchesBegan(touches, with: event)
     else 
        super.touchesBegan(touches, with: event)
    


override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) 
    guard let touches = event?.touches(for: self) else  return 
    if touches.count < 2 
        self.next?.touchesEnded(touches, with: event)
     else 
        super.touchesEnded(touches, with: event)
    


override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) 
    guard let touches = event?.touches(for: self) else  return 
    if touches.count < 2 
        self.next?.touchesMoved(touches, with: event)
     else 
        super.touchesMoved(touches, with: event)
    


override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) 
    guard let touches = event?.touches(for: self) else  return 
    if touches.count < 2 
        self.next?.touchesCancelled(touches, with: event)
     else 
        super.touchesCancelled(touches, with: event)
    


override func touchesShouldCancel(in view: UIView) -> Bool 
    if (type(of: view)) == UIScrollView.self 
        return true
    
    return false

【问题讨论】:

【参考方案1】:

您需要将长按手势识别器连接到您的 ScrollerView,设置为 Min Duration 0 seconds,还可以识别 仅 1 次触摸取消触摸查看选项处于活动状态。

您可以在 Interface Builder 的 Attributes Inspector 下找到所有这些选项。

请稍微调整一下容差设置以微调结果。

【讨论】:

我确实有 在视图中取消触摸选项处于活动状态,但抱歉,您所说的仅识别 1 次触摸是什么意思?我仍然希望滚动视图能够识别 2 次触摸以及将 1 次触摸传递给下一个响应者,这将是我的画布。我会尝试长按手势识别器,但我需要经常更新画布以模拟绘图,我希望使用 touchesmoved 方法,因为我不确定如何在识别器的选择器中实现这一点,谢谢顺便说一句,答案会尝试! 对不起,我可能不太清楚。您应该依靠 GestureRecognizer 来捕捉触摸并采取相应的行动,从而有效地取消底层视图的触摸。我以前成功地使用此设置来捕获绘图和手势。据我了解,UIScrollView 无法有效地管理平移/拖动手势以将它们传递给它包含的视图。 是的,我是!我实际上使用了一个不同的解决方案,它是子类 UIScrollView 并将我想要触摸的视图作为子视图添加到子类,而不是公共父视图控制器的子视图。然后 UIScrollView 从来没有要求触摸回来,因为它已经是对动作的响应。它现在运行良好,但感谢您的回答!

以上是关于让 UIScrollView 放弃 UITouch的主要内容,如果未能解决你的问题,请参考以下文章

iOS收起键盘

何时使用 UITouch 与 UIScroll

UITouch 事件转发到的所有子视图的列表

有没有办法在 iOS 中中断活动的 UITouch

UIScrollView:仅在允许时滚动

iOS收起键盘