在项目开发中我们可能会遇到这样子的情况,比如在我们登陆的时候需要把数据发送给服务器进行比对,通常我们的做法是当用户点击按钮后,使用一个加载效果的view遮挡住当前界面,直到服务器返回数据或者超时。如果不进行遮挡,用户可能频繁的点击登录,而你又一直发送数据,这样子显然是不信的,解决这样子的方法有很多种。

今天我们说一种方式,让按钮响应时间由自己控制。
要想达到这种效果你可能需要去了解一下什么是 Runtime

OK,如果你不是很了解也没有关系,对于这个功能用到的也不多。其中包括:

 objc_getAssociatedObject(<#id object#>, <#const void *key#>)
参数一:一般都是self,调用者
参数二:你的key(key - value) 有get方法那么肯定会有set objc_setAssociatedObject(<#id object#>, <#const void *key#>, <#id value#>, <#objc_AssociationPolicy policy#>)
参数一:self
参数二:key
参数三:value,这里要注意包装成为id类型对于int、float等基本类型
参数四:MRC基础的东西
/*
OBJC_ASSOCIATION_ASSIGN = 0,
OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,
OBJC_ASSOCIATION_COPY_NONATOMIC = 3,
OBJC_ASSOCIATION_RETAIN = 01401,
OBJC_ASSOCIATION_COPY = 01403
*/
为什么会用到上面的方法,因为在给一个Category动态添加属性。

完成了动态添加属性之后,我们需要利用Runtime的性质去对系统的方法动动手脚了。

这里我们还需要了解三个方法 分别是:

通过这个方法可以得到系统对象方法的编号,类型是Method
class_getInstanceMethod(<#__unsafe_unretained Class cls#>, <#SEL name#>) 通过这个方法可以获取到系统类方法的编号,类型是Method
class_getClassMethod(<#__unsafe_unretained Class cls#>, <#SEL name#>) 这里我们要获取到的是对象的方法,所以用第一个,在获取到系统的方法之后呢,我们需要定义一个自己的方法,用来和系统的方法进行互换 互换两个方法的编号
method_exchangeImplementations(<#Method m1#>, <#Method m2#>) 如图所示:互换前和互换后
交换前
交换后
所以我就达到了交换的目的。

了解了上面的几个方法之后,我们就可以开始 写代码了

首先如果想要使用Runtime第一步你得先导入:
  #import <objc/message.h>

第二步利用Runtime动态的去添加属性

这里要重写get set方法。
通过kvc赋值,所以我们先要有key,用来存/取数据

static char * const PQ_ACCEPTTIMEKEY = "pq_acceptTime";
static char * const PQ_DELAYINTERVALKEY = "pq_delayButtonInterVal";
// getter method
- (NSTimeInterval)pq_delayButtonInterVal{
return [objc_getAssociatedObject(self, PQ_DELAYINTERVALKEY) doubleValue];
}
- (NSTimeInterval)pq_acceptTime{
return [objc_getAssociatedObject(self, PQ_ACCEPTTIMEKEY) doubleValue];
}
// setter method
- (void)setPq_delayButtonInterVal:(NSTimeInterval)pq_delayButtonInterVal{
objc_setAssociatedObject(self, PQ_DELAYINTERVALKEY, @(pq_delayButtonInterVal), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (void)setPq_acceptTime:(NSTimeInterval)pq_acceptTime{
objc_setAssociatedObject(self, PQ_ACCEPTTIMEKEY, @(pq_acceptTime), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

完成动态添加属性之后,我们要把系统的方法和我们的方法进行互换,以便于添加功能。

 + (void)load{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Method systemMethod = class_getInstanceMethod([self class], @selector(sendAction:to:forEvent:));
Method myselfMethod = class_getInstanceMethod([self class], @selector(pq_sendAction:to:forEvent:));
BOOL isAdd = class_addMethod([self class], @selector(sendAction:to:forEvent:), method_getImplementation(myselfMethod), method_getTypeEncoding(myselfMethod));
if (!isAdd) {
method_exchangeImplementations(systemMethod, myselfMethod);
}
});
}

然后我们就要写自己的方法了,这里有一个小技巧把,先把系统的方法名打上,比如对于这个方法可以这样做:
1. 先输入 - sendAction 一般打到这里系统就会提示自动补全

2. 得到系统的方法名之后在前面添加我们的前缀,表示是我们自己的方法。比如

这里我就添加了一个前缀pq,再用下划线连接。
- (void)pq_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event

接下来就是处理代码的实现

 这里用到的两个变量一个需要对外公开(.h文件中),一个写在(.m文件中的)
@interface UIControl () @property (nonatomic,assign) NSTimeInterval pq_acceptTime; @end - (void)pq_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event{
if (NSDate.date.timeIntervalSince1970 - self.pq_acceptTime < self.pq_delayButtonInterVal) {
NSLog(@"现在点我我也不鸟你");
return;
}
if (self.pq_delayButtonInterVal > ) {
self.pq_acceptTime = NSDate.date.timeIntervalSince1970;
}
[self pq_sendAction:action to:target forEvent:event];
}

至此,功能就完成啦,小伙伴们可以马上使用了

自己创建一个button,然后设置如下代码,如果你发现找不到你自己定义的属性,那么你一般是没有导入头文件在ViewController中
//设置这个延时时间是5秒钟
self.clickMeBtn.pq_delayButtonInterVal = 5;

到这里就全部完成啦,码字不容易,如果您觉得还行,麻烦顶一下!转载请注明出处,谢谢。

IOS动态修改按钮响应时间的更多相关文章

  1. iOS 动态修改导航栏颜色 UINavigationBar

    示例 所谓动态修改  意思是 在当前页面滚动的过程中 亦或 是在 触发返回事件\进入一个新的页面  导航栏的动态变化 由于系统级别的navBar 高度集成  很多自己想实现的功能 很不好弄 如果是通过 ...

  2. ios 动态修改UILabel字体大小

    - (IBAction)sliderChange:(id)sender {   NSLog(@"sliderChange");   UISlider *slider = (UISl ...

  3. 聊聊 Vue 中 title 的动态修改

    由于之前的 Vue 项目打包成果物一直是嵌入集成平台中,所以一直没有关注过项目的 title.直到最近,突然有个需求,要求点击按钮在集成平台外新开一个页面,此时我才发现,原来我的项目的 title 一 ...

  4. uniapp动态修改导航栏

    1.修改导航栏buttons 如图动态修改角标 <template> <view> </view> </template> <script> ...

  5. ReactNative 根据scrollView/listview滑动距离动态修改NavBar颜色

    我们常见某些APP上滑的时候,NavBar颜色会从透明渐变为某种颜色 原理非常简单,根据scrollView的回调动态修改NavBar的透明度即可. 在RN中,尤其是ListView中这个回调不是很好 ...

  6. 自己动手丰衣足食之轮播图一动态修改marginTop属性实现轮播图

    引言 学习jQuery有年头了,刚开始学习时自己动手写过轮播图,放的久了以至于忘了大致思路了.现在转而做前端,抽空把jquery轮播图拿出来写一写,把各种思路都自己练习练习,这里主要使用动态修改mar ...

  7. Swift - 实现点击cell动态修改高度

    Swift - 实现点击cell动态修改高度 效果 源码 https://github.com/YouXianMing/Swift-Animations // // TapCellAnimationC ...

  8. [SAP ABAP开发技术总结]动态修改选择屏幕

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  9. iOS动态部署方案

    转载: iOS动态部署方案 前言 这里讨论的动态部署方案,就是指通过不发版的方式,将新的内容.新的业务流程部署进已发布的App.因为苹果的审核周期比较长,而且苹果的限制比较多,业界在这里也没有特别多的 ...

随机推荐

  1. Windows下Lua+Redis 断点调试环境搭建==Linux下类似

    Lua+Redis 断点调试环境搭建 windows环境,使用Redis,写lua脚本头疼的问题之一不能对脚本断点调试,google加上自己的摸索,终于搞定. 1.下载ZeroBraneStudio, ...

  2. 【CSS】Intermediate2:Pseudo Classes

    1.specify a state or relation to the selector selector:pseudo_class { property: value; } 2.Link 3.Dy ...

  3. 增加eclipse启动的Tomcat内存的方法 tomcat内存增加

    增加eclipse启动的Tomcat内存的方法 Tomcat一般默认情况下最大最优内存设置为2G 这种情况下,修改Tomcat\bin\catalina.bat,添加如下内容 set JAVA_OPT ...

  4. Android Fragment 基本介绍[转]

    Fragment Android是在Android 3.0 (API level 11)开始引入Fragment的. 可以把Fragment想成Activity中的模块,这个模块有自己的布局,有自己的 ...

  5. uvalive 7331 Hovering Hornet 半平面交+概率期望

    题意:一个骰子在一个人正方形内,蜜蜂在任意一个位置可以出现,问看到点数的期望. 思路:半平面交+概率期望 #include<cstdio> #include<cstring> ...

  6. HDU2639Bone Collector II(01背包变形)

    01背包,求第k大. 以前看k短路的时候看过代码以为懂了 = =结果还是跑去看了别人的代码才会.果然要自己写一遍才行啊 0.0难得1A.. 每次把可能的2k种求出来,求前k个.注意要不一样的k个数.. ...

  7. innobackupex自动备份脚本(增量备份,自动压缩)

    #!/bin/bash #日期转为天数 function date2days { echo "$*" | awk '{ z=-$)/); y=$+-z; m=$+*z-; j=*m ...

  8. 设置JVM内存溢出时快照转存HeapDump到文件

    诊断内存溢出是一个有难度的事情,可以在生产环境试一试下面的参数,在发生内存溢出OutOfMemoryError时做HeapDump并保存到文件,然后分析该文件看是否能查到蛛丝马迹. set JAVA_ ...

  9. Geogebra里给带有曲线和直线混合边界的封闭区域填充颜色

    目的 用Geogebra绘制如图所看到的曲线,并填充如图边界的区域为实心: 用代码实现当然是能够的,可是,图形过于简单的时候用代码就不经济了.由于每个细小变动都还要调整改动代码并预览,非所见即所得.往 ...

  10. [GIF] GIF Loop Coder - Introduction

    Introducing the program, GIF Loop Coder, which allows you to make looping animated gifs (and other t ...