iOS手势shouldBeRequiredToFailByGestureRecognizer 机制

news/2025/1/15 0:43:59/

我们在iOS的手势代理方法中看到这样三个方法

  • (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
  • (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
  • (void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer;

其中,前面两个都是手势的代理方法,
后面那个是手势的一个实例方法

那么这三个方法分别是什么作用呢,从字面上看并且从
苹果官方的文档上看, a shouldBeRequiredToFailByGestureRecognizer:b
的含义是手势a (设置代理对象的手势) 的响应 需要
手势b(其他手势)响应失败,就是只有手势b 不相应的时候,手势a才能响应

我们通过如下代码进行测试

shouldBeRequiredToFailByGestureRecognizer

//
//  LBGestureFailureController.m
//  TEXT
//
//  Created by mac on 2025/1/11.
//  Copyright © 2025 刘博. All rights reserved.
//#import "LBGestureFailureController.h"@interface LBGestureFailureController () <UITableViewDelegate, UITableViewDataSource, UIGestureRecognizerDelegate>@property (nonatomic, strong) UITableView *tableView;@end@implementation LBGestureFailureController- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = [UIColor whiteColor];[self.view addSubview:self.tableView];UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan)];pan.delegate = self;[self.view addGestureRecognizer:pan];// Do any additional setup after loading the view.
}- (void)pan
{NSLog(@"相应自己添加的滑动手势");
}#pragma mark - UIGestureRecognizerDelegate- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{return YES;
}- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{return YES;
}#pragma mark - UITableViewDelegate, UITableViewDataSource- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([UITableViewCell class])];NSString *title = [NSString stringWithFormat:@"%ld", indexPath.row];cell.textLabel.text = title;cell.contentView.backgroundColor = [UIColor cyanColor];return cell;
}- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{return 60;
}- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{return 100;
}#pragma mark - lazy load- (UITableView *)tableView
{if (!_tableView) {_tableView = [[UITableView alloc] initWithFrame:CGRectMake(10, 80, 300, 600) style:UITableViewStylePlain];[_tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:NSStringFromClass([UITableViewCell class])];_tableView.delegate = self;_tableView.dataSource = self;_tableView.backgroundColor = [UIColor cyanColor];}return _tableView;
}@end

效果如下
在这里插入图片描述

我们滑动列表的时候,只能滚动列表,我们自己添加的滑动手势的方法是没有响应的。
这个时候,我们去掉这句

  • (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
    {
    return YES;
    }

然后在滑动列表,发现我们自己添加的手势方法是有
响应的

因为这句 shouldRequireFailureOfGestureRecognizer
返回YES的时候,就是我们自己添加的手势,需要其他的手势失败的时候,才能响应,就是别的手势要比我们自己添加的手势的级别要高,所以这个时候,只响应了tableView自带的滑动手势

shouldBeRequiredToFailByGestureRecognizer

从字面上看,这个代理方法的意思是其他方法的响应需要我们这个方法响应失败,就是如果我们这个方法响应了,其他方法就不能响应了

如果我们实现了这个方法

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{return YES;
}

我们发现我们尝试拖动列表的时候,已经无法滚动了,
只响应了我们自己添加的手势的响应方法,因为
其他手势的响应需要我们这个手势失败,但是我们的手势是能响应的,所以列表自带的滑动手势就不能响应了

requireGestureRecognizerToFail

[a requireGestureRecognizerToFail:b], a手势的成功响应需要b手势响应失败,即b 手势的优先级高,
我们添加这句代码

    [self.tableView.panGestureRecognizer requireGestureRecognizerToFail:pan];

发现拖动列表的时候,无法滚动,只能响应我们自己添加的手势方法,
所以这个方法,是直接调用实例方法,设置两个手势的优先级


http://www.ppmy.cn/news/1563178.html

相关文章

《Java核心技术II》网络使用telnet

使用telnet telnet是一种用于网络编程的非常强大的调试工具&#xff0c;可以在命令shell中输入telnet来启动它。 注释&#xff1a;在Windows中需要激活它&#xff0c;控制面板->程序->打开/关闭Windows特性->Telnet客户端。 连接当日时间服务 连接到当日时间服务&…

如何确保api采集到的小红书笔记图片的版权合法性?

在采集小红书笔记图片时&#xff0c;确保版权合法性是非常重要的&#xff0c;以下是一些方法&#xff1a; 一、遵守平台规则 仔细阅读小红书使用条款 小红书有明确的社区规则和使用条款&#xff0c;其中涉及到对内容版权的规定。开发者应该认真研究这些条款&#xff0c;明确什么…

C#解决浮点数精度丢失的问题(参考方案)

问题描述 直接看代码 按照正常来说这里因该打印的结果是0.1 但是这里精度丢失了&#xff0c;这里我试了很多办法最终想到了下面的解决办法。 这时候我们需要用逆转的思路来解决问题。 既然浮点数有问题那么直接把它转成整数不就行了。 用这种方法就可以打印出一个数的小数部…

14. C语言 指针(深入理解)

本章目录: 前言&#xff1a;什么是指针&#xff1f; 内存与地址&#xff1a;指针的基础指针的声明与使用指针变量的声明指针与地址的关系 空指针与野指针空指针&#xff08;NULL Pointer&#xff09;野指针&#xff08;Dangling Pointer&#xff09; 指针进阶&#xff1a;从数组…

H266/VVC 帧内预测中 ISP 技术

帧内子划分 ISP ISP 技术是在 JVET-2002-v3 提案中详细介绍其原理&#xff0c;在 VTM8 中完整展示算法。ISP是线基内预测&#xff08;LIP&#xff09;模式的更新版本&#xff0c;它改善了原始方法在编码增益和复杂度之间的权衡&#xff0c;ISP 算法的核心原理就是利用较近的像…

centos systemd方式配置jar开机自启

将后端服务&#xff08;一个 Java 应用程序&#xff09;注册为 CentOS 上的 systemd 服务&#xff0c;可以让你方便地管理其启动、停止和重启。以下是详细步骤&#xff1a; 创建 systemd 服务单元文件 创建一个 systemd 服务单元文件&#xff0c;例如 /etc/systemd/system/de…

基于php的web系统漏洞攻击靶场设计与实践

web系统漏洞攻击靶场 摘 要 互联网极速发展的同时&#xff0c;也会带来一些安全性的风险&#xff0c;一些不为人知的安全问题也逐渐暴露出来。近年来&#xff0c;媒体不断披露了许多网络安全事故&#xff0c;许多网络应用程序被黑客攻击&#xff0c;导致内部数据外泄&#xf…

深度学习——pytorch基础入门

一、张量 在PyTorch中&#xff0c;张量是PyTorch中最基本的数据结构。张量可以看作是一个多维数组&#xff0c;可以在GPU上加速运算。PyTorch的张量和Numpy的数组非常类似&#xff0c;但是与Numpy不同的是&#xff0c;PyTorch的张量可以自动地在GPU上进行加速计算。 PyTorch中的…