UIControl 和 UIGesture增加点击间隔

8-26 UIControl UIGestureRecognizer 控件 UIControl,一个交互类 UIImageView无自带的监听事件,可用UIControl来帮助实现监听 UIImageView的交互属性一定要手动打开,默认是关闭的 UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"01"]]; //交互属性打开 阅读详情

UIControl 和 UIGesture 可以通过 addTarget: action: 增加事件.有时候我们需要两次点击之间添加一定间隔,这里就来处理这种需求.

实现原理

OC 是动态调用过程,是运行时机制.即在编译的时候并不能决定真正调用哪个函数,只有在真正运行的时候才会根据函数的名称找到对应的函数来调用.所以可以利用runtime 动态替换实现事件.在运行时替换系统事件,调用自定义事件,然后在这里判断是否是能触发有效点击.

具体实现

创建Category,引入 “objc/runtime.h” 在category中添加属性,间隔时间.

#import "objc/runtime.h"
/*
*/

//点击间隔
@property(nonatomic, assign) NSTimeInterval nx_acceptEventInterval;

// 是否忽略本次点击
@property(nonatomic) BOOL ignoreEvent;

由于UIControl使用的是@selector(sendAction:to:forEvent:)实现action方法,而UIView是通过UIGesture添加,使用的是@selector(gestureRecognizerShouldBegin:)实现action方法,所以分别处理.

1.改变两个方法的实现。在类第一次使用的时候回调用这个方法

+ (void)load
{
    //UIControl:
    Method a = class_getInstanceMethod(self, @selector(sendAction:to:forEvent:));
    Method b = class_getInstanceMethod(self, @selector(__uxy_sendAction:to:forEvent:));


    /*
    //UIView:
    Method a = class_getInstanceMethod(self, @selector(gestureRecognizerShouldBegin:));
    Method b = class_getInstanceMethod(self, @selector(__nx_gestureRecognizerShouldBegin:));
    */
    //改变两个方法的实现
    method_exchangeImplementations(a, b);
}

这里是将系统的方法A与自定义的方法B动态替换,在运行时,当系统需要调用A方法时,会直接调用B方法.

2.自定义方法中 根据点击间隔判断是不是有效点击

//设置点击间隔
- (NSTimeInterval)nx_acceptEventInterval
{
    return [objc_getAssociatedObject(self, UITableViewCell_acceptEventInterval) doubleValue];
}

- (void)setNx_acceptEventInterval:(NSTimeInterval)uxy_acceptEventInterval
{
    objc_setAssociatedObject(self, UITableViewCell_acceptEventInterval, @(uxy_acceptEventInterval),
                             OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
//是否忽略本次点击
- (void)setIgnoreEvent:(BOOL)ignoreEvent
{
    objc_setAssociatedObject(self, UITableViewCell_ignoreEvent, @(ignoreEvent), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (BOOL)ignoreEvent { return [objc_getAssociatedObject(self, UITableViewCell_ignoreEvent) boolValue]; }

//自定义替换方法
- (BOOL)__nx_gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    if (self.ignoreEvent)
    {
        NSLog(@"无效点击!!!!!!!!!!");
        return NO;
    }
    if (self.nx_acceptEventInterval > 0)
    {
        self.ignoreEvent = YES;
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(self.nx_acceptEventInterval * NSEC_PER_SEC)),
                       dispatch_get_main_queue(), ^{
                           self.ignoreEvent = NO;
                       });
    }
    //调用系统实现
    return   [self __nx_gestureRecognizerShouldBegin:gestureRecognizer];
}
6、 探索iOS控件:从UIControl到各种UI组件 本文深入探讨了iOS开发中的控件,从基础的UIControl类到具体的UI组件(如文本字段、滑块、开关、按钮等),并通过目标-动作机制实现用户交互。文章还提供了代码示例和实践练习,帮助开发者掌握这些控件的使用方法,构建更丰富的用户界面。 阅读详情

相关推荐

ios UIControl类使用方法,ios快速入门

适合新手观看的ios demo合集,掌握每种方法即可ios入门 代码简单 适合新手

iOS_设置 UIButton 点击时间间隔,防止连续重复点击

//按钮第二次点击事件触发的等待时间 #define Button_Seconds_Time(_seconds_) \ static BOOL shouldPrevent; \ if (shouldPrevent) return; \ shouldPrevent = YES; \ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)((...

宋卓的博客 1421

深入浅析IOS中UIControl

UIControl,相信大家对其并不陌生吧,比如平常最常用的UIButton就是继承自UIControl的。下面通过本篇文章给大家介绍ios中UIControl,感兴趣的朋友一起学习吧

iOS 手势UIGestureRecognizer详解

一、引言 在iOS系统中,手势是进行用户交互的重要方式,通过UIGestureRecognizer类,我们可以轻松的创建出各种手势应用于app中。关于UIGestureRecognizer类,是对iOS中的事件传递机制面向应用的封装,将手势消息的传递抽象为了对象。 二、手势的抽象类——UIGestureRecognizer UIGestureRecognizer将一些和手势操作相关的方法抽象了出来,但它本身并不实现什么手势,因此,在开发中,我们一般不会直接使用UIGestureRecognizer的对象,而

Rey的技术博客 2661

【影像组学入门百问】1#---#3

理论上讲三大主流平台Windows, Linux和MacOS均可进行影像组学研究。根据笔者实际经验,如果内存不足可能导致软件罢工,其余显示、GPU等均非必要。显示:最小分辨率为1024×768(推荐为1280×1024或更好)。Slicer中的许多计算都是多线程的,并且将受益于多核,多CPU配置。计算机需要足够的内存和图形功能将原始数据和处理结果保存在其内存中。如涉及深度学习等方法的研究需根据实际需求配置电脑,无法一概而论。接口设备:推荐使用带滚轮的三键鼠标。内存:超过4GB(推荐8G以上)。

weixin_38594676的博客 1484

超实用!用 Ollama + DeepSeek + Dify 搭建本地知识库,提升企业效率

本文介绍了如何使用 Ollama + DeepSeek + Dify 搭建本地知识库,帮助企业高效管理信息。通过简单配置,可实现智能问答、文档检索等功能,提升效率并保障数据安全。

Happiness is everywhere 4294

iOS UIControl控件

UIControl是UIView的子类,本身包含了一些属性和方法,但是不能直接使用UIControl类,只能通过继承的方式为子类提供公共的接口和动作结构。如果自定义一个可交互控件,可以继承于UIControl而非UIView。可查看iOS UIView控件。 1. UIControl的重要方法 action对象的分发 方法 说明 sendActionsForControlEvents:(UIControlEvent) 发送与指定类型相关的所有行为消息。我们可以调用控件的这个方法来发送参数co

假装你是大灰狼的专栏 926

ctx->cvdl->cuvidGetDecoderCaps(&ctx->caps8) failed -> CUDA_ERROR_DEINITIALIZED: driver shutting down

ffplay -vcodec h264_cuvid sample_720p-2.h264 [quantum6@freeswitch freeswitch]$ ffplay -vcodec h264_cuvid sample_720p-2.h264 ffplay version 4.3.1 Copyright (c) 2003-2020 the FFmpeg developers built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-44) .

柳鲲鹏 2404

iOS使用UIGestureRecognizer手势

UIKit框架提供了一些预定义的GestureRecognizer.包含下列手势:  UITapGestureRecognizer敲击手势(单击和双击)  UIPinchGestureRecognizer(缩放手势)  UIRotationGestureRecognizer(旋转手势)  UISwipeGestureRecognizer(擦碰手势)  UIPanGestureRecogn...

培根芝士的专栏 747

基于截图详解:SAP GUI for Java 如何设置登录链接,以及 conn= 连接字符串该怎么写

摘要:SAP GUI for Java 的连接属性配置关键是在"高级"页签的"conn="后填写连接字符串。连接字符串格式取决于网络拓扑:直连应用服务器使用"/H/主机/S/端口";通过消息服务器负载均衡使用"/M/消息服务器/S/端口/G/组名";经SAProuter访问则需添加路由器前缀。配置时需注意专家模式会覆盖其他页签设置,且连接字符串还支持附加参数如客户端、语言和默认事务码。具体填写内容应根据Basis团队提供的系统信

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 250

SAP FI 会计科目表(COA)可直接套用配置模板

摘要:本文提供了SAP S/4HANA环境下可直接套用的会计科目表(COA)配置模板,包含科目编码规则、号段规划、科目组设置等核心内容。模板采用10位数字编码,按资产(1000)、负债(2000)、权益(3000)、成本(4000)、收入(5000)、费用(6000)六大类划分号段,并预设科目组控制字段状态。适用于集团/单一公司、国内/跨国企业场景,支持多表架构映射,配置完成后可通过事务码SAKO验证科目清单。模板遵循"前4位固定一级科目"原则,企业可根据行业特性调整明细科目。

金牌架构师 266

UIControl 的基本使用方法和 Target-Action 机制

我们在开发应用的时候,经常会用到各种各样的控件,诸如按钮(UIButton)、滑块(UISlider)、分页控件(UIPageControl)等。这些控件用来与用户进行交互,响应用户的操作。我们查看这些类的继承体系,可以看到它们都是继承于UIControl类。UIControl是控件类的基类,它是一个抽象基类,我们不能直接使用UIControl类来...

weixin_33863087的博客 388

数学之美:欣赏超越数e

文章目录一、e为何物?二、利息与e的关系1、利息问题2、计算利息3、欣赏螺旋线(1)螺旋线概述(2)绘制螺旋线三、e和π 一、e为何物? e是一个无限不循环小数,其值约等于2.718281828…,它是一个超越数,有时也称为欧拉数(Euler’s Number)。 以e为底的对数称为自然对数(Natural Logarithm),数学中使用自然这个词的还有自然数(Natural Number)。 这里的“自然”并不是现代人所习惯的“大自然”,而是有点儿“天然存在,非人为”的意思。 二、利息与e的关系

howard2005的专栏 1717

iOS事件链小记

我们都知道,iOS有一套事件分发和响应链条。这里的优先级判断UIControl其实也是走的responder的touch事件,只不过在实现了touch方法之后没有向下传递,响应链的传递实际上就是给下一个responder传递事件。所以我们在平时研发过程中,一定要注重学习,很多细节上的疏忽都是由于基础知识过于薄弱,看似简单的问题也可能卡壳,当然,是可以换一种方式解决问题,但是我相信那一定不是最好的解决办法。现在遇到的问题是v2点击后不响应事件,经过多方排查,和其他视图及vc的事件传递没有关联。...

qq_33714244的博客 231

Epicor ERP 界面新增客制化字段操作方法

我发现国内对于epicor这个erp软件的教程非常少,所以录制一些我实际遇到的需求,整理了实现过程,提供给大家参考。

cqxianggang的专栏 412

第3版•系统集成项目管理工程师(中级) │ 第12章 执行过程组 ✦ 管理沟通

🥏第3版•系统集成项目管理工程师(中级) │ 第12章 执行过程组 ✦ 管理沟通

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 1万+

UI--Gesture

别的不说 上干货 各种手势用法1.轻拍 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)]; self.imv.userInteractionEnabled = YES;//因为图片会阻断事件,所以在其上面添加手势的时

ZHCforIT的博客 454

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

触摸,事件,UIGestureRecognizer

1.UIView的触摸控制是在UIView中编程处理,不是在UIViewController中编程处理。 2.独占触摸模式。。。 3.- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event    在UIView中判断触摸的点是否在UIView中起作用。可以实现一些非矩形的触摸事件。    例如:圆形,判

5016

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

UIControl 功能和用法

首先,我们将深入了解UIControl的基本概念。了解它是如何作为iOS开发中的交互控件,为用户提供丰富的交互体验。

微赚淘客系统开发者博客 668

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

UIControl IOS控件编程—IOS开发

[size=xx-large][b]UIControl IOS控件编程[/b]—IOS开发[/size] UIKit提供了一组控件:UISwitch开关、UIButton按钮、UISegmentedControl分段控件、UISlider滑块、UITextField文本字段控件、UIPageControl分页控件。 控件是对UIView派生类的实用增强及补充,并可以直接附着于导航栏、表格单元,...

lizaochengwen的专栏 204

iOS 事件(UITouch、UIControl、UIGestureRecognizer)传递机制

一.触摸、事件、响应者 1. UITouch 源起触摸 一个手指一次触摸屏幕,就对应生成一个UITouch对象。多个手指同时触摸屏幕,生成多个UITouch对象。 多个手指先后触摸,系统会根据触摸的位置判断是否更新同一个UITouch对象。若两个手指一前一后触摸同一个位置(即双击),那么第一次触摸时生成一个UITouch对象,第二次触摸会更新这个UI...

海阔天空的专栏 1603

iOS UIControl 详解

UIControl是UIView的子类,当然也是UIResponder的子类。UIControl是诸如UIButton,UISwitch,UItextField等控件的父类,它本身包含了一些属性和方法,但是不能直接食用UIControl类,他只是定义了子类都需要使用的方法。 UIControl对象采用了一种新的事件处理机制,将前一节指节处理的触摸时间直接转换为简单操作,这样可以无需关心...

ddiv24492的博客 211

iOS——UIControl

一、概述 1. UIControl 对象 1)UIControl 类是好多控件的父类,但是不能直接使用 UIControl 类,它只是定义了子类通用的方法 2)UIControl 是 UIView 的子类,所以是一个视图控件,可以显示在屏幕上;UIControl 也是 UIResponder 的子类,所以可以响应一系列的事件,例如 触摸事件 3)UIControl 类采用了一种新的事件处理

透心凉的博客 715

UIControl详解

UIControl

逢个场,作个戏 1746

UITapGestureRecognizer 点击效果出现两次或者多次的问题

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33871366的博客 1703
上一篇: Swift guard 和 if的使用
下一篇: 在CAAnimation中暂停动画
Philm_iOS
博客等级 码龄8年 74粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值