用Runtime解决UIButton重复点击问题

转载 2016年08月30日 16:12:55

用Runtime解决UIButton重复点击问题

       通常我们在项目中会遇到这样的问题,点击一个button触发一个事件,但总是会遇到连点的问题,如果是动画,连点会让你的动画出现意想不到的情况。我在之前的项目中也遇到过类似的情况,上网搜过很多解决方法,但都没有得到想要解决方案。前几天在cocoachina一篇文章中得到启发,自己写了一Demo共享给大家。废话不多说先上图,没图说个jiba .

       


两个button的点击事件完全相同,都是让红色的view的中心点从(25,89)到(200,500)但很明显没做控制的button在多次点击的情况下动画不是我们想要的效果。

再上代码

@interface UIControl (YN)

@property (nonatomic, assign) NSTimeInterval hyn_acceptEventInterval;//添加点击事件的间隔事件

@property (nonatomic, assign) BOOL hyn_ignoreEvent;//

@end


#import@implementation UIControl (YN)

static const char *UIControl_acceptEventInterval = "UIControl_acceptEventInterval";

static const char *UIcontrol_ignoreEvent = "UIcontrol_ignoreEvent";

- (NSTimeInterval)hyn_acceptEventInterval {

return [objc_getAssociatedObject(self, UIControl_acceptEventInterval) doubleValue];

}

- (void)setHyn_acceptEventInterval:(NSTimeInterval)hyn_acceptEventInterval {

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

}

- (BOOL)hyn_ignoreEvent {

return [objc_getAssociatedObject(self, UIcontrol_ignoreEvent) boolValue];

}

- (void)setHyn_ignoreEvent:(BOOL)hyn_ignoreEvent {

objc_setAssociatedObject(self, UIcontrol_ignoreEvent, @(hyn_ignoreEvent), OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

+ (void)load {

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

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

method_exchangeImplementations(a, b);

}

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

if (self.hyn_ignoreEvent) return;

if (self.hyn_acceptEventInterval > 0) {

self.hyn_ignoreEvent = YES;

[self performSelector:@selector(setHyn_ignoreEvent:) withObject:@(NO) afterDelay:self.hyn_acceptEventInterval];

}

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

}

@end


使用:

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UIButton *button;//用Runtime做控制的button

@property (weak, nonatomic) IBOutlet UIView *colorView;//红色的view

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

//设置一个延迟时间,为了方便观察我这里把动画设置成三秒

self.button.hyn_acceptEventInterval = 3;

}

//Runtime控制的button点击事件

- (IBAction)runtimeAction:(UIButton *)sender {

[UIView animateWithDuration:3 animations:^{

self.colorView.center = CGPointMake(200, 500);

} completion:^(BOOL finished) {

self.colorView.center = CGPointMake(25, 89);

}];

}

//普通的buttonAction

- (IBAction)buttonAction:(UIButton *)sender {

[UIView animateWithDuration:3 animations:^{

self.colorView.center = CGPointMake(200, 500);

} completion:^(BOOL finished) {

self.colorView.center = CGPointMake(25, 89);

}];

}

@end

为了方便看代码截个图,这年头没图就是没把发说事



你还在一个一个单独控制多次点击吗?采用Runtime的方法,让你简单到1行代码解决重复点击问题

self.button.hyn_acceptEventInterval = 0.xx;

就是那么简单。

文章灵感来自Cocoachina 

相关文章推荐

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

iOS之使用Runtime解决UIButton多次点击(重复点击)

在实际开发中我们,点击一个button按键时,需要触发一个事件去执行。用户在正常操作情况下,单次点击时,button只会响应一次点击。但是如果用户多次点击一个button,那么就会引起这个事件被多次执...

runtime - UIButton点击事件重复处理

原理,写一个UIButton的分类: 为分类添加一个属性表示控制两次按钮点击事件触发的时间间隔。 修改UIControl点击事件方法的实现过程,修改按钮的是否可交互行为。 代码:....

iOS小技巧--用runtime 解决UIButton 重复点击问题

iOS小技巧–用runtime 解决UIButton 重复点击问题什么是这个问题我们的按钮是点击一次响应一次, 即使频繁的点击也不会出问题, 可是某些场景下还偏偏就是会出问题. 通常是如何解决我们通常...

iOS小技巧–用runtime 解决UIButton 重复点击问题

什么是这个问题 我们的按钮是点击一次响应一次, 即使频繁的点击也不会出问题, 可是某些场景下还偏偏就是会出问题. 通常是如何解决 我们通常会在按钮点击的时候设置这个按钮不可点击. 等...

iOS小技巧--用runtime 解决UIButton 重复点击问题

iOS小技巧–用runtime 解决UIButton 重复点击问题 什么是这个问题 我们的按钮是点击一次响应一次, 即使频繁的点击也不会出问题, 可是某些场景下还偏偏就是会出问题.  通常是如何...

用runtime 解决UIButton 重复点击问题

iOS小技巧–用runtime 解决UIButton 重复点击问题
  • wsjshx
  • wsjshx
  • 2016年01月07日 21:59
  • 372

利用Runtime来拦截UIButton的点击事件,防止重复点击

对于公司原来的一些代码,想对UIButton的点击事件做一部分修改,但是如果使用继承出来的UIBtton来解决的话, 又要改大量的代码,这时候,使用runtime拦截替换发送点击事件的方法可以迅速解决...

iOS- 利用runtime,解决多次点击相同button,导致重复跳转的问题

作者:ocarol 原文链接:http://www.jianshu.com/p/65ce6471cd0f 场景 当app有点卡的时候,多次点击相同的but...

iOS runtime扩大UIButton点击范围

我们知道C代码一般经过预处理、编译、链接、运行然后在平台上跑起来,Objective-C是基于C加入了面向对象和消息转发的动态语言,所以除了需要一个编译器外,还需runtime系统来动态创建类和对象。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用Runtime解决UIButton重复点击问题
举报原因:
原因补充:

(最多只允许输入30个字)