博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ios解决button重复点击的问题
阅读量:6524 次
发布时间:2019-06-24

本文共 2309 字,大约阅读时间需要 7 分钟。

分类头文件:

#import <UIKit/UIKit.h>

 

@interface UIControl (CDControlCategory)

@property(nonatomic,assign)NSTimeInterval uxy_acceptEventInterval;// 可以用这个给重复点击加间隔

@property (nonatomic) BOOL ignoreEvent;

@end

 

 

----------分类实现:----------

#import "UIControl+HCDControlCategory.h"

#import <objc/runtime.h>

 

static const char *UIControl_acceptEventInterval = "UIControl_acceptEventInterval";

static const char *UIControl_ignoreEvent = "UIControl_ignoreEvent";

 

 

@implementation UIControl (HCDControlCategory)

 

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

+(void)load{

    Method a = class_getInstanceMethod(self, @selector(sendAction:to:forEvent:));

    Method b = class_getInstanceMethod(self, @selector(__uxy_sendAction:to:forEvent:));

    //改变两个方法的实现

    method_exchangeImplementations(a, b);

}

//通过关联对象重写getset方法

- (NSTimeInterval)uxy_acceptEventInterval

{

    return [objc_getAssociatedObject(self, UIControl_acceptEventInterval) doubleValue];

}

 

- (void)setUxy_acceptEventInterval:(NSTimeInterval)uxy_acceptEventInterval

{

    objc_setAssociatedObject(self, UIControl_acceptEventInterval, @(uxy_acceptEventInterval), OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

#pragma mark 现在是否可点的getset。通过关联对象。

-(void)setIgnoreEvent:(BOOL)ignoreEvent{

    objc_setAssociatedObject(self, UIControl_ignoreEvent, @(ignoreEvent), OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

-(BOOL)ignoreEvent{

    return [objc_getAssociatedObject(self, UIControl_ignoreEvent) boolValue];

}

 

 

- (void)__uxy_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event

{

    if (self.ignoreEvent) return;

    if (self.uxy_acceptEventInterval > 0)

    {

        

        self.ignoreEvent = YES;

        [self performSelector:@selector(setIgnoreEvent:) withObject:@(NO) afterDelay:self.uxy_acceptEventInterval];

    }

    //调用系统实现

    [self __uxy_sendAction:action to:target forEvent:event];

}

 

 

@end

 

 

------------------ 使用 ---------------

- (void)viewDidLoad {

    [super viewDidLoad];

 

    UIButton *tempBtn = [UIButton buttonWithType:UIButtonTypeCustom];

    tempBtn.frame = CGRectMake(100, 100, 30, 30);

    tempBtn.backgroundColor = [UIColor greenColor];

    [tempBtn addTarget:self action:@selector(clickWithInterval:) forControlEvents:UIControlEventTouchUpInside];

    tempBtn.uxy_acceptEventInterval = 2.5;

    

    [self.view addSubview:tempBtn];

}

 

 

#pragma mark 这里其实就是调用我们自定义的那个方法。

-(void)clickWithInterval:(UIButton *)sender{

    NSLog(@"你试试看。");

}

转载于:https://www.cnblogs.com/supersr/p/7428675.html

你可能感兴趣的文章
Serv-U 的升级及数据备份和迁移【转】
查看>>
webstorm无法显示左边文件夹目录的解决方法
查看>>
数字校园-云资源平台 2014.10.26-人人通共享空间
查看>>
为你的网站加上SSL,可以使用HTTPS进行访问
查看>>
软件project--谈项目开发
查看>>
在Android中创建文件
查看>>
爬虫基础
查看>>
JS组件系列——再推荐一款好用的bootstrap-select组件,亲测还不错
查看>>
getopt--parse command line options
查看>>
闭包和OC的block的本质
查看>>
MySQL出现Waiting for table metadata lock的场景浅析
查看>>
C# 语言历史版本特性(C# 1.0到C# 7.1汇总更新)
查看>>
什么是数据埋点?
查看>>
git回滚
查看>>
vue2.0 引用qrcode.js实现获取改变二维码的样式
查看>>
Python 判断闰年,判断日期是当前年的第几天
查看>>
web.xml 中的listener、 filter、servlet 加载顺序
查看>>
MyBatis原理简介和小试牛刀
查看>>
js部分基础
查看>>
脏读,幻读,不可重复读解释和例子
查看>>