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

我们可以给按钮添加一个属性重复点击间隔, 通过设置这个属性来控制再次接受点击事件的时间间隔.

@interface UIControl (XY)@property (nonatomic, assign) NSTimeInterval uxy_acceptEventInterval;   // 可以用这个给重复点击加间隔@endstatic const char *UIControl_acceptEventInterval = "UIControl_acceptEventInterval";- (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);} 

在app启动的时候,我们hook 所有的按钮的 event

@implementation UIControl (XY)+ (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);}@end 

在我们的点击事件里呢,对点击事件做下过滤

- (void)__uxy_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event{    if (self.uxy_ignoreEvent) return;    if (self.uxy_acceptEventInterval > 0)    {        self.uxy_ignoreEvent = YES;        [self performSelector:@selector(setUxy_ignoreEvent:) withObject:@(NO) afterDelay:self.uxy_acceptEventInterval];    }    [self __uxy_sendAction:action to:target forEvent:event];}


实际使用起来就是这个样子

 UIButton *tempBtn = [UIButton buttonWithType:UIButtonTypeCustom];    [tempBtn addTarget:self action:@selector(clickWithInterval:) forControlEvents:UIControlEventTouchUpInside];    tempBtn.uxy_acceptEventInterval = 0.5; 

文章至此就结束了.虽然不推荐大范围用runtime, 但是小范围内使用还是可以解决不少小问题的.



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值