文档章节

防止 UIButton 重复点击,多次响应事件

Jack088
 Jack088
发布于 2017/09/07 14:39
字数 193
阅读 37
收藏 0
#import <UIKit/UIKit.h>


@interface UIButton (TouchTimeInterval)

@property (nonatomic, assign) NSTimeInterval timeInterVal;

@end
#import "UIButton+TouchTimeInterval.h"
#import <objc/runtime.h>
static const char *UIControl_acceptEventInterval = "UIControl_acceptEventInterval";
static const char *UIControl_acceptEventTime = "UIControl_acceptEventTime";

@interface UIButton ()

@property (nonatomic, assign) NSTimeInterval cc_acceptEventTime;

@end

@implementation UIButton (TouchTimeInterval)

- (void)setTimeInterVal:(NSTimeInterval)timeInterVal{
    objc_setAssociatedObject(self, UIControl_acceptEventInterval, @(timeInterVal), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    
}

- (NSTimeInterval)timeInterVal{
    return [objc_getAssociatedObject(self, UIControl_acceptEventInterval) doubleValue];
}

- (NSTimeInterval )cc_acceptEventTime{
    return [objc_getAssociatedObject(self, UIControl_acceptEventTime) doubleValue];
}

- (void)setCc_acceptEventTime:(NSTimeInterval)cc_acceptEventTime{
    objc_setAssociatedObject(self, UIControl_acceptEventTime, @(cc_acceptEventTime), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

+ (void)load{
    //获取着两个方法
    Method systemMethod = class_getInstanceMethod(self, @selector(sendAction:to:forEvent:));
    SEL sysSEL = @selector(sendAction:to:forEvent:);
    
    Method myMethod = class_getInstanceMethod(self, @selector(cc_sendAction:to:forEvent:));
    SEL mySEL = @selector(cc_sendAction:to:forEvent:);
    
    //添加方法进去
    BOOL didAddMethod = class_addMethod(self, sysSEL, method_getImplementation(myMethod), method_getTypeEncoding(myMethod));
    
    //如果方法已经存在了
    if (didAddMethod) {
        class_replaceMethod(self, mySEL, method_getImplementation(systemMethod), method_getTypeEncoding(systemMethod));
    }else{
        method_exchangeImplementations(systemMethod, myMethod);
        
    }
}

- (void)cc_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event{
    if (NSDate.date.timeIntervalSince1970 - self.cc_acceptEventTime < self.timeInterVal) {
        return;
    }
    
    if (self.timeInterVal > 0) {
        self.cc_acceptEventTime = NSDate.date.timeIntervalSince1970;
    }
    
    [self cc_sendAction:action to:target forEvent:event];
}


@end

ps: http://blog.csdn.net/icetime17/article/details/51782983

© 著作权归作者所有

Jack088
粉丝 45
博文 552
码字总数 90026
作品 0
扬州
程序员
私信 提问
iOS UIButton之防止重复点击(控制事件响应时间间隔)

级别:★★☆☆☆ 标签:「UIButton Runtime」「UIButton点击频率」「UIButton防止多次点击」 作者: Xs·H 审校: QiShare团队 有几个实际业务场景需要控制响应事件的时间间隔。比如: 1、当...

QiShare
2018/08/08
0
0
UIImageView与UIButton

应用场合 UIImageView主要用在只显示图片,没有点击事件的情况并且处理图片更加专业,动画例子: NSMutableArray *images = [NSMutableArray array]; for (int i=0; i<sum; i++) { NSBundle ...

天边那束阳光
2014/10/01
2.2K
0
UIButton的响应事件 UIControlEvents 类型说明

UIButton的点击态 UIButton的点击事件状态UIControlEvents主要有如下几种: UIControlEventTouchDown = 1 << 0, // on all touch downs UIControlEventTouchDownRepeat = 1 << 1, // on mult......

shede333
2015/09/22
1K
0
iOS 如何解决无法将键盘隐藏

问题: 在一个父视图上添加了UITableView以及一个UITextView(UITextView为底部,其余为UITableView的布局)。当点击UITextView的时候,响应正常。当结束写入的时候,需要调用[UITextView res...

萨斯辈的呼唤
2014/10/10
830
0
UIGesture和UIControl的前世今缘

UIGesture和UIControl的前世今缘 最近发现很多同学都搞不清楚 UIGesture 和 UIControl 的正确使用姿势。即便是做了多年 iOS 开发的 senior engineer 也搞不清楚这整个脉络。于是我决定写一篇...

Joey_Xu
2018/11/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

刚哥谈架构 (二) 我眼中的架构师

之前在公司,有小伙伴在向别人介绍我的时候,经常会有人这么说:“刚哥是我们的architcture”,如果来人是老外,心中一定是一惊,心中暗叹,“这位匪首看上去貌不惊人,难道已经做到了架构和...

naughty
41分钟前
3
0
OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
118
4
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
5
0
Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部