让 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的主要内容,如果未能解决你的问题,请参考以下文章