自定义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
相关产品推荐
相关产品推荐

