Ios 让UIScrollView放弃UITouch

Ios 让UIScrollView放弃UITouch,ios,swift,uiscrollview,uitouch,touch-event,Ios,Swift,Uiscrollview,Uitouch,Touch Event,我有一个绘图应用程序,画布比手机屏幕大。我想实现两个手指滚动和一个手指绘图。到目前为止,我可以使滚动工作刚刚好,但当涉及到绘图,线开始,然后在那里绘图的视图失去了触摸控制,这样只有第一部分的线被绘制。我认为scrollview重新获得了控制权。圆点可以画得很好 这是我的子类UIScrollView override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { guard let touc

我有一个绘图应用程序,画布比手机屏幕大。我想实现两个手指滚动和一个手指绘图。到目前为止,我可以使滚动工作刚刚好,但当涉及到绘图,线开始,然后在那里绘图的视图失去了触摸控制,这样只有第一部分的线被绘制。我认为scrollview重新获得了控制权。圆点可以画得很好

这是我的子类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
}
override func touchsbegind(touch:Set,带有事件:UIEvent?){
guard let touchs=event?.touchs(for:self)else{return}
如果接触,则计数<2{
self.next?触摸开始(触摸,带有:事件)
}否则{
super.touchesbeated(touches,with:event)
}
}
覆盖函数touchesend(touchs:Set,带有事件:UIEvent?){
guard let touchs=event?.touchs(for:self)else{return}
如果接触,则计数<2{
self.next?.touchesend(触摸,带有:事件)
}否则{
super.touchesend(触摸,带有:事件)
}
}
覆盖功能触摸移动(touchs:Set,带有事件:UIEvent?){
guard let touchs=event?.touchs(for:self)else{return}
如果接触,则计数<2{
self.next?.touchesMoved(触摸,带有:事件)
}否则{
super.touchesMoved(touches,with:event)
}
}
覆盖功能触摸已取消(touchs:Set,带有事件:UIEvent?){
guard let touchs=event?.touchs(for:self)else{return}
如果接触,则计数<2{
self.next?.touchscancelled(触摸,带有:事件)
}否则{
super.touchscancelled(触摸,带有:事件)
}
}
覆盖功能触摸应取消(在视图中:UIView)->Bool{
if(type(of:view))==UIScrollView.self{
返回真值
}
返回错误
}

您需要一个长按手势识别器连接到您的ScrollView,设置为分钟持续时间0秒,还需要识别视图中仅1次触摸取消触摸选项处于活动状态

您可以在Interface Builder的属性检查器下找到所有这些选项


请稍微使用容差设置来微调结果。

您需要一个长按手势识别器连接到您的ScrollView,设置为分钟持续时间0秒,还需要在视图中识别仅1次触摸取消触摸选项处于活动状态

您可以在Interface Builder的属性检查器下找到所有这些选项


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

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