iOS UITableView自带滑动手势和父视图添加滑动手势冲突响应机制探索

场景

我们有时候会遇到这样的一个交互场景:我们有一个UITableView
放在一个弹窗中,这个弹窗可以通过滑动进行展示和消失(跟手滑动的方式),然后这个UITableView放在弹窗中,并且可以滚动,展示一些内容,比如商品信息,评论,(类似抖音的评论弹窗),并且下滑的时候,如果tableView已经滑动到了顶部,就可以响应滑动手势,继续向下滑动弹窗。

思路

首先,我们弹窗视图中有一个tableView,这个tableView是可以正常的滑动的,然后,我们在弹窗视图中添加一个滑动手势,手势的响应方法中,修改弹窗的frame。所以,这个弹窗视图是要响应手势的代理
方的,并且 在

  • (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
    代理方法中,如果gestureRecognizer 是自身的滑动手势,otherGestureRecognizer是tableView 的滑动手势,则需要支持同时响应的,即返回YES,同时,需要有个主意事项,就是如果我们的
    tableView滚动到最顶部了,就需要设置tablView的滚动手势不支持响应,否则的话,就会导致 滚动到顶部的时候,tableView还会继续滚动,如果这个时候来回滑动tableView,就会造成弹窗和tableView 同时滚动的情况,这是我们不想要的,所以我们tablView滚动到顶部的时候,就需要设置tableView的pangesture.enabled = NO.

双滑动手势滚动响应机制

我们给弹窗添加一个滑动手势,响应方法为handlePan:
通过测试我们发现,我们手在tableView 上滚动的时候,每次执行
tableView 的 代理方法 scrollViewDidScroll 之前,都会执行 handlePan方法。

请添加图片描述

并且,在一次滑动(手没有脱离屏幕算同一次滑动)过程中,
如果响应方法 handlePan 中有设置过
self.tableView.panGestureRecognizer.enabled = NO; 就会导致
本次滑动中self.tableView 不会滚动,即便在self.tableView.panGestureRecognizer.enabled = NO后面设置了 self.tableView.panGestureRecognizer.enabled = YES也不会滚动

这说明,**在一次滑动手势的响应中, self.tableView.panGestureRecognizer.enabled = NO 的优先级是最高的

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{NSLog(@"哈哈哈哈哈这里是执行scrollViewDidScroll self.panNum是%ld", self.panNum);
}
- (void)handlePan:(UIPanGestureRecognizer *)pan
{self.tableView.panGestureRecognizer.enabled = YES;NSLog(@"哈哈哈哈哈这是第%ld次响应滑动手势handlePan 方法", self.panNum);if (self.panNum % 2 == 0) {self.tableView.panGestureRecognizer.enabled = NO;} else {self.tableView.panGestureRecognizer.enabled = YES;}self.tableView.panGestureRecognizer.enabled = YES;
}

请添加图片描述

以上测试的完整代码

//
//  LBPangestureController.m
//  TEXT
//
//  Created by mac on 2024/7/7.
//  Copyright © 2024 刘博. All rights reserved.
//#import "LBPangestureController.h"@interface LBPangestureController () <UITableViewDelegate, UITableViewDataSource, UIGestureRecognizerDelegate>@property (nonatomic, strong) UITableView *tableView;@property (nonatomic, strong) UIPanGestureRecognizer *pangesture;@property (nonatomic, assign) NSInteger panNum;@end@implementation LBPangestureController- (void)viewDidLoad {[super viewDidLoad];[self.view addSubview:self.tableView];[self.view addGestureRecognizer:self.pangesture];// Do any additional setup after loading the view.
}- (void)handlePan:(UIPanGestureRecognizer *)pan
{self.tableView.panGestureRecognizer.enabled = YES;NSLog(@"哈哈哈哈哈这是第%ld次响应滑动手势handlePan 方法", self.panNum);if (self.panNum % 2 == 0) {self.tableView.panGestureRecognizer.enabled = NO;} else {self.tableView.panGestureRecognizer.enabled = YES;}self.tableView.panGestureRecognizer.enabled = YES;
}#pragma mark  - UITableViewDelegate, UITableViewDataSource- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([UITableViewCell class])];cell.textLabel.text = [NSString stringWithFormat:@"%ld", indexPath.row];return cell;
}- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{return 100;
}- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{return 60;
}#pragma mark - uiscrollViewdelegate- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{NSLog(@"哈哈哈哈哈这里是执行scrollViewDidScroll self.panNum是%ld", self.panNum);
}#pragma mark - gesturedelegate- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{if (gestureRecognizer == self.pangesture) {self.panNum ++;}return YES;
}- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{if (gestureRecognizer == self.pangesture && otherGestureRecognizer == self.tableView.panGestureRecognizer) {return YES;}return NO;
}#pragma mark - lazy load- (UITableView *)tableView
{if (!_tableView) {_tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 100, 300, 400) style:UITableViewStylePlain];[_tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:NSStringFromClass([UITableViewCell class])];_tableView.delegate = self;_tableView.dataSource = self;_tableView.backgroundColor = [UIColor cyanColor];}return _tableView;
}- (UIPanGestureRecognizer *)pangesture
{if (!_pangesture) {_pangesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];_pangesture.delegate = self;}return _pangesture;
}/*
#pragma mark - Navigation// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {// Get the new view controller using [segue destinationViewController].// Pass the selected object to the new view controller.
}
*/@end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/44325.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用微信服务号支付门诊缴费

时间上午10刚过&#xff0c;医院里计价收费处排起了长龙&#xff0c;放眼望去&#xff0c;左边的窗口六条队。右边在原来发药的位置也开辟了收费窗口&#xff0c;数了一下有四条队。一共十条排队付费的长龙&#xff0c;每一条队伍的人数不下20人&#xff0c;也即超过200人在排队…

百度智能云将大模型引入网络故障定位的智能运维实践

物理网络中&#xff0c;某个设备发生故障&#xff0c;可能会引起一系列指标异常的告警。如何在短时间内从这些告警信息中找到真正的故障原因&#xff0c;犹如大海捞针&#xff0c;对于运维团队是一件很有挑战的事情。 在长期的物理网络运维工作建设中&#xff0c;百度智能云通…

【前端从入门到精通:第十一课: JS基本语法】

独闯JavaScript 了解JavaScript 为什么学习JavaScript JavaScript 是 web 开发者必学的三种语言之一&#xff1a; HTML 定义网页的内容 CSS 规定网页的布局 JavaScript 对网页行为进行编程 我们学习 JavaScript&#xff0c;以及 JavaScript 如何与 HTML 和 CSS 协同工作的知…

数字力量助西部职教全面提升——唯众品牌大数据、人工智能系列产品中标甘肃庆阳职院数字经济人才培养基地!

近日&#xff0c;唯众品牌凭借在大数据和人工智能领域深耕多年的技术积累和卓越产品&#xff0c;成功中标庆阳职业技术学院全国一体化算力网络国家枢纽节点数字经济人才培养基地项目&#xff0c;标志着唯众在助力西部职业教育与数字经济融合发展的新征程上迈出了坚实的一步。 …

Data Guard高级玩法:failover备库后,通过闪回恢复DG备库

作者介绍&#xff1a;老苏&#xff0c;10余年DBA工作运维经验&#xff0c;擅长Oracle、MySQL、PG、Mongodb数据库运维&#xff08;如安装迁移&#xff0c;性能优化、故障应急处理等&#xff09; 公众号&#xff1a;老苏畅谈运维 欢迎关注本人公众号&#xff0c;更多精彩与您分享…

怎样将aac转换mp3格式?推荐四个aac转MP3的方法

怎样将aac转换mp3格式&#xff1f;当需要将aac格式音频转换为MP3格式时&#xff0c;有几种方法可以轻松实现这一目标。MP3是一种广泛支持的音频格式&#xff0c;几乎所有设备和平台都能播放MP3文件&#xff0c;包括各种音乐播放器、手机、平板电脑和汽车音响系统。而且它也提供…

MySQL:视图、用户管理、C/C++/图形化界面链接访问数据库、网页逻辑

文章目录 1.视图1.1 视图的基本使用1.2 视图的基本规则 2.用户管理2.1 创建、删除、修改用户2.2 数据库权限 3.C/C/图形化界面链接访问数据库3.1 准备工作及常用接口介绍3.2 图形化界面访问MySQL 4.用户逻辑(注册&&登录) 1.视图 视图是一个虚拟表&#xff0c;其内容由…

嵌入式上gst rtsp server opencv mat

0 安装gstreamer sudo apt install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-…

怎么提高音频声音大小?提高音频声音大小的四种方法

怎么提高音频声音大小&#xff1f;在音频处理和编辑中&#xff0c;增加声音的音量是一个常见的需求&#xff0c;尤其是在确保音频清晰度和听觉效果的同时。调整音频的音量不仅仅是简单地提高音频的响度&#xff0c;它也涉及到如何保持音质的高标准&#xff0c;确保没有失真或削…

后端登录校验——Filter过滤器和Interceptor拦截器

一、Filter过滤器 前面我们学会了最先进的会话跟踪技术jwt令牌&#xff0c;那么我们要让用户使用某些功能时就要根据jwt令牌来验证用户身份&#xff0c;来决定他是否登陆了、让不让用户访问这个页面&#xff08;或功能&#xff09; 但是这样一来&#xff0c;没发一个请求&…

绝区零启动遇到的问题

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ​ 绝区零》作为米哈游的一款全新都…

【机器学习】(基础篇三) —— 线性回归

线性回归 本文介绍最经典的监督学习问题——线性回归&#xff0c;包括单变量线性回归和多变量线性回归 线性回归是回归任务&#xff0c;输入是带有标签的数据&#xff0c;根据数据关系&#xff0c;拟合出一个线性函数&#xff0c;并利用该函数进行预测等操作。线性回归分为单…

Python爬虫:BeautifulSoup的基本使用方法!

1.简介 Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析“标签树”等功能。它是一个工具箱&#xff0c;通过解析文档为用户提供需要抓取的数据&#xff0c;因为简单&#xff0c;所以不需要多少代码就可以写出一个完整的应用程序。 Beautiful Soup…

回收站删除了是不是彻底删除了 回收站删除了怎么找回 回收站删除了还能找回来吗

电脑删除的数据文件一般不会直接被彻底删除掉&#xff0c;而是会暂存在回收站中&#xff0c;这样设计主要是为了防止误删除等操作&#xff0c;如果不小心删除了很重要的文件&#xff0c;只需要在回收站对文件进行还原即可。为了让大家更了解回收站&#xff0c;下面给大家详细讲…

MIT机器人运动控制原理浅析-人形机器人

MIT人形机器人基于开发改进的执行器全新设计&#xff0c;通过可感知执行器运动动力学移动规划器(Actuator-Aware Kino-Dynamic Motion Planner)及着地控制器(Landing Controller)等实现机器人的运动控制。 机器人设计 机器人高0.7米&#xff0c;21KG(四肢重量 25%)&#xff0c;…

生物打印后的生物力学过程

生物打印后的生物力学过程 3D生物打印技术在组织工程领域展现出巨大的潜力&#xff0c;但打印后组织的生物力学特性对其最终成功至关重要。本文将详细介绍打印后组织的生物力学特性及其在组织工程中的应用。 1. 打印后水凝胶交联 原位交联可以在生物打印过程中提供足够的机械…

Python 爬虫与 Java 爬虫:相似之处、不同之处和选项

在信息时代&#xff0c;网络上可用的数据量巨大且不断增长。为了从这些数据中提取有用的信息&#xff0c;爬虫已成为一种重要的技术。Python 和 Java 都是流行的编程语言&#xff0c;都具有强大的爬虫功能。本文将深入探讨 Python 爬虫和 Java 爬虫之间的差异&#xff0c;以帮助…

【RIP实验-熟悉基础配置】

实验拓扑 实验要求 根据实验拓扑的IP地址分配&#xff0c;为所有设备配置对应的IP地址和环回地址。全网运行RIPv2&#xff0c;将R1、R2、R3和R4的物理端口、Loopback地址和10.1.00网段进行宣告。并在rip协议下配置路由自动汇总&#xff0c;观察R1/R2是否能够收到10.0.0.0的详细…

Python虚拟环境:Virtualenv和Pipenv的安装理解与使用

Python虚拟环境&#xff1a;Virtualenv和Pipenv的安装理解与使用 引言 在Python开发中&#xff0c;一个常见的问题是不同项目依赖不同版本的库&#xff0c;这可能导致版本冲突。为解决这个问题&#xff0c;Python社区创造了虚拟环境工具&#xff0c;如Virtualenv和Pipenv。本…

门墙柜加工中心是做什么的?

门墙柜加工中心&#xff0c;带有六工序自动换刀&#xff0c;是一款主要针对门板、衣柜门板、墙板扣件等工件的加工设备。 它可以实现多种加工工艺&#xff0c;如侧孔、三合一、隐性件等连接件&#xff0c;铰链孔&#xff0c;天地铰链槽、门锁孔槽、免拉手槽、海棠槽、灯槽、拉…