You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义SignView嵌套ScrollView时签名触发滚动的问题求助

解决签名时ScrollView滚动干扰的问题

这个问题我之前做签名功能时也碰到过,核心原因是UIScrollView会优先拦截滑动类的触摸事件,导致你在SignView上签名时,手势被ScrollView的滚动逻辑干扰,没法正常绘制签名。下面给你几个简单可行的解决办法:

方法一:触摸签名区域时临时禁用ScrollView滚动

这是最直接的方案,当用户开始触摸签名视图时,关闭ScrollView的滚动功能,触摸结束后再恢复。

步骤1:在你的ViewController中重写触摸事件方法

添加以下代码到你的ViewController类里:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesBegan(touches, with: event)
    guard let touch = touches.first else { return }
    
    // 把触摸点转换到getFormView的坐标系,判断是否在signView范围内
    let touchLocationInGetForm = touch.location(in: getFormView)
    let signViewFrameInGetForm = signView.convert(signView.bounds, to: getFormView)
    
    if signViewFrameInGetForm.contains(touchLocationInGetForm) {
        getFormView.isScrollEnabled = false
    }
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesEnded(touches, with: event)
    // 触摸结束后恢复滚动
    getFormView.isScrollEnabled = true
}

override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesCancelled(touches, with: event)
    // 触摸被取消时也要恢复滚动
    getFormView.isScrollEnabled = true
}

为什么这样有效?

当用户的触摸点落在签名视图范围内时,我们直接禁用ScrollView的滚动,这样ScrollView就不会拦截触摸事件,签名视图可以完整接收所有触摸点来绘制签名;触摸结束或取消时再恢复滚动,不影响页面其他区域的正常滚动。


方法二:自定义容器视图拦截ScrollView手势

如果不想修改ViewController的触摸逻辑,可以给你的mainSignView自定义一个子类,让它阻止ScrollView的滑动手势触发。

步骤1:创建自定义容器视图类

class SignContainerView: UIView {
    override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        // 如果是ScrollView的滑动手势,直接阻止它开始
        if gestureRecognizer is UIPanGestureRecognizer {
            return false
        }
        return super.gestureRecognizerShouldBegin(gestureRecognizer)
    }
}

步骤2:替换原有的mainSignView创建代码

把你原来创建mainSignView的代码改成:

mainSignView = SignContainerView(frame: CGRect(x: 20, y: uniY, width: 250, height: 250))

为什么这样有效?

这个自定义容器视图会拦截范围内的滑动手势,让ScrollView的滚动逻辑无法触发,同时不影响签名视图的触摸事件接收,适合需要保持ViewController代码简洁的场景。


额外建议

从你的代码来看,每次点击签名按钮都会重新创建mainSignView和signView,建议可以把这些视图的创建逻辑抽成单独的方法,避免重复代码;另外如果YPDrawSignatureView本身支持手势回调,也可以直接用它的回调来控制ScrollView的滚动状态,效果是一样的。

内容的提问来源于stack exchange,提问作者iOS Developer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:27:20