右滑返回手势和UIScrollView中手势冲突的解决方法
发布时间 - 2026-01-10 23:16:31 点击率:次项目中遇到一个页面中是以一个scrollview横向Tab展示两个不同功能的显示,譬如消息和公告功能,但是由于滑动返回手势和scrollview的滑动返回手势冲突了,导致页面不再能够滑动返回。类似的还有图片浏览功能也出现过。

iOS系统中,滑动返回手势,其实是一个UIPanGestureRecognizer,系统默认的操作是只有滑动屏幕的左边的某个位置,UIPanGestureRecognizer才会起作用。UIScrollView的滑动手势也是UIPanGestureRecognizer。那在侧边滑动时,让UIScrollView的不响应事件就OK了嘛,首先想到了继承UIScrollView 重写下面的方法,让滑动侧边时scrollView不响应事件,根据响应者链,事件最终会传递给下方的滑动手势。
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
if (point.x < location.x) { // location.x为系统的某个点的x
return nil;
} else {
return [super hitTest:point withEvent:event];
}
}
但是,这样有个问题,就是在一个页面不同tab时,也需要滑动切换,滑动返回。
由于scrollView的滑动手势拦截了事件,那我重写scrollView中panGestureRecognizer的代理方法,让它不拦截就好了嘛。于是继承UIScrollView,重写下面的方法。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
if ([self panBack:gestureRecognizer]) {
return YES;
}
return NO;
}
- (BOOL)panBack:(UIGestureRecognizer *)gestureRecognizer {
if (gestureRecognizer == self.panGestureRecognizer) {
UIPanGestureRecognizer *pan = (UIPanGestureRecognizer *)gestureRecognizer;
CGPoint point = [pan translationInView:self];
UIGestureRecognizerState state = gestureRecognizer.state;
if (UIGestureRecognizerStateBegan == state || UIGestureRecognizerStatePossible == state) {
CGPoint location = [gestureRecognizer locationInView:self];
if (point.x > 0 && location.x < “这个自己设定" && self.contentOffset.x <= 0) {
return YES;
}
}
}
return NO;
}
需要侧边滑动时 panBack 返回YES,这时候,我让scrollView的手势和页面的滑动返回手势共存,scrollView不拦截手势,那不就可以滑动返回了吗。好了,测试一下,可以滑动返回,但是滑动返回时,为什么scrollView也跟着在滑动呢,太影响美观了,看来还需要另外的办法,我又回到了第一种办法时的想法,让scrollView切换的时候相应panGesture,滑动返回的时候不响应,那重写scrollView中的另外一个panGestureRecognizer的代理方法。
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
if ([self panBack:gestureRecognizer]) {
return NO;
}
return YES;
}
第二种方法:
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
// 首先判断otherGestureRecognizer是不是系统pop手势
if ([otherGestureRecognizer.view isKindOfClass:NSClassFromString(@"UILayoutContainerView")]) {
// 再判断系统手势的state是began还是fail,同时判断scrollView的位置是不是正好在最左边
if (otherGestureRecognizer.state == UIGestureRecognizerStateBegan && self.contentOffset.x == 0) {
return YES;
}
}
return NO;
}
以上的代码都是在一个自定义的UIScrollView上的,重写上面的方法即可。然后让横向滚动的scrollView继承这个自定义UIScrollView就OK了。
原理:
scrollView的pan手势会让系统的pan手势失效,所以我们只需要在系统手势失效且scrollView的位置在初始位置的时候让两个手势同时启用就可以了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# 右滑返回手势
# UIScrollView手势
# 手势冲突
# IOS手势操作(拖动、捏合、旋转、点按、长按、轻扫、自定义)
# iOS开发中的几个手势操作实例分享
# iOS实现手势解锁操作
# 使用Swift代码实现iOS手势解锁、指纹解锁实例详解
# 基于JS实现Android
# iOS一个手势动画效果
# iOS仿邮箱大师的九宫格手势密码解锁
# iOS开发之触摸事件以及手势
# iOS轻点、触摸和手势代码开发
# iOS手势密码的实现方法
# iOS开发之手势识别
# 重写
# 自定义
# 就可以
# 都是
# 是一个
# 好了
# 有个
# 才会
# 只需
# 我又
# 要在
# 那我
# 会让
# 还需要
# 种方法
# 另外一个
# 在一
# 它不
# 我让
# 第一种
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何确保FTP站点访问权限与数据传输安全?
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
如何快速搭建高效香港服务器网站?
微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】
Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】
如何使用 jQuery 正确渲染 Instagram 风格的标签列表
微信小程序制作网站有哪些,微信小程序需要做网站吗?
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
QQ浏览器网页版登录入口 个人中心在线进入
高端网站建设与定制开发一站式解决方案 中企动力
如何为不同团队 ID 动态生成多个独立按钮
高防服务器租用首荐平台,企业级优惠套餐快速部署
百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
JS实现鼠标移上去显示图片或微信二维码
音乐网站服务器如何优化API响应速度?
Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程
图册素材网站设计制作软件,图册的导出方式有几种?
如何利用DOS批处理实现定时关机操作详解
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
太平洋网站制作公司,网络用语太平洋是什么意思?
网站优化排名时,需要考虑哪些问题呢?
Win11关机界面怎么改_Win11自定义关机画面设置【工具】
html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】
如何快速搭建自助建站会员专属系统?
香港网站服务器数量如何影响SEO优化效果?
Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】
php增删改查怎么学_零基础入门php数据库操作必知基础【教程】
如何在VPS电脑上快速搭建网站?
如何实现建站之星域名转发设置?
Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践
node.js报错:Cannot find module 'ejs'的解决办法
HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程
如何快速搭建高效服务器建站系统?
如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
什么是javascript作用域_全局和局部作用域有什么区别?
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
深圳网站制作培训,深圳哪些招聘网站比较好?
零基础网站服务器架设实战:轻量应用与域名解析配置指南
长沙做网站要多少钱,长沙国安网络怎么样?
如何批量查询域名的建站时间记录?
Android利用动画实现背景逐渐变暗
如何快速搭建FTP站点实现文件共享?
佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】
Laravel如何使用Telescope进行调试?(安装和使用教程)
Python企业级消息系统教程_KafkaRabbitMQ高并发应用

