推广

[iOS ]Runtime防止按钮重复点击

iseeyu2年前 (2024-02-21)推广131

image.png

在UIButton+Delay.m文件中增加属性

// 重复点击间隔
@property (nonatomic, assign) NSTimeInterval acceptEventInterval;
// 上一次点击时间戳
@property (nonatomic, assign) NSTimeInterval acceptEventTime;

重写load方法,利用Runtime进行方法交换

 + (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Class class = [self class];

        SEL originalSelector = @selector(sendAction:to:forEvent:);
        SEL swizzledSelector = @selector(mySendAction:to:forEvent:);

        Method originalMethod = class_getInstanceMethod(class, originalSelector);
        Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);

        BOOL didAddMethod = class_addMethod(class,
                                            originalSelector,
                                            method_getImplementation(swizzledMethod),
                                            method_getTypeEncoding(swizzledMethod));

        if (didAddMethod) {
            class_replaceMethod(class,
                                swizzledSelector,
                                method_getImplementation(originalMethod),
                                method_getTypeEncoding(originalMethod));
        } else {
            method_exchangeImplementations(originalMethod, swizzledMethod);
        }
    });
}

实现要交换的方法判断是否短时间内连续点击

- (void)mySendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event {
    
    // 如果想要设置统一的间隔时间,可以在此处加上以下几句
    if (self.acceptEventInterval <= 0) {
        // 如果没有自定义时间间隔,则默认为 0.4 秒
        self.acceptEventInterval = 0.4;
    }
    
    // 是否小于设定的时间间隔
    BOOL needSendAction = (NSDate.date.timeIntervalSince1970 - self.acceptEventTime >= self.acceptEventInterval);
    
    // 更新上一次点击时间戳
    if (self.acceptEventInterval > 0) {
        self.acceptEventTime = NSDate.date.timeIntervalSince1970;
    }
    
    // 两次点击的时间间隔小于设定的时间间隔时,才执行响应事件
    if (needSendAction) {
        [self mySendAction:action to:target forEvent:event];
    }else{
        NSLog(@"连续点击,不响应");
    }
}

利用Runtime动态添加属性


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

- (void)setAcceptEventInterval:(NSTimeInterval)acceptEventInterval{
    objc_setAssociatedObject(self, "UIControl_acceptEventInterval", @(acceptEventInterval), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

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

- (void)setAcceptEventTime:(NSTimeInterval)acceptEventTime{
    objc_setAssociatedObject(self, "UIControl_acceptEventTime", @(acceptEventTime), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

补充:最近被QA提了一个bug,调用系统摄像头拍照的时候点击拍摄按钮没有反应,经排查,是因为添加了UIButton+Delay.h类。解决方法如下:

- (void)mySendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event {
    
    // 如果想要设置统一的间隔时间,可以在此处加上以下几句
    if (self.acceptEventInterval <= 0) {
        // 如果没有自定义时间间隔,则默认为 0.4 秒
        self.acceptEventInterval = 0.4;
    }
    
    // 是否小于设定的时间间隔
    BOOL needSendAction = (NSDate.date.timeIntervalSince1970 - self.acceptEventTime >= self.acceptEventInterval);
    
    // 更新上一次点击时间戳
    if (self.acceptEventInterval > 0) {
        self.acceptEventTime = NSDate.date.timeIntervalSince1970;
    }
    NSString *method = NSStringFromSelector(action);
    if ([method isEqualToString:@"_handleShutterButtonPressed:"]) {
        //点击相机拍照按钮事件则不判断是连续点击.
        [self mySendAction:action to:target forEvent:event];
        return;
    }
    // 两次点击的时间间隔小于设定的时间间隔时,才执行响应事件
    if (needSendAction) {
        [self mySendAction:action to:target forEvent:event];
    }else{
        NSLog(@"连续点击,不响应");
    }
}

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://0291.com.cn/post/56762.html

相关文章

淘宝资质认证在哪查看(淘宝资质审核在哪能看到)

淘宝资质认证在哪查看(淘宝资质审核在哪能看到)

首先,我们通过各种渠道进入淘宝网站,点击店铺的卖家中心,进入卖家中心之后找到应用中心一项。在进入应用中心之后,在宝贝管理一栏的下方点击添加应用,然后会出现发布宝贝、橱窗推荐、资质认证等等备选项,这时候点击资质认证旁边的添加按钮进行添加。...

淘宝0元开店靠谱吗(0元开网店靠谱吗)

淘宝0元开店靠谱吗(0元开网店靠谱吗)

先说一点,说是0元开店,实际上保证金一个子都不能少,按照类目不同要几千几万的,虽然保证金最后可以拿回去,但实实在在把钱掏出来了,都希望自己能把店铺运营好。...

自律过程中的正能量和负能量

自律过程中的正能量和负能量

大家好,有时候我常常在想,很多朋友没有信心戒掉的根源是什么。我想其中一个很重要的原因就是因为不了解戒色究竟是一个怎样的过程和原理。冰山效应是我用自己的经验总结出来的名词,可能没有什么科学依据,但相信,通过我的阐述,你会对戒色有一个更直观的了解。希望能给大家做一个参考。1、冰...

新格局下财富管理之路,专家透露了很多……

新华网北京9月15日电(何凡 王晔)作为拓展居民收入增长的着力点,“创新更多适应家庭财富管理需求的金融产品”,被写入《“十四五”规划和2035远景目标纲要》。近日,养老理财产品试点和粤港澳大湾区“跨境理财通”业务试点正式启动,进一步丰富了居民投资金融产品的渠道。未来,我国财...

网站关键词布局介绍。

网站关键词布局介绍。

「seo」网站关键词的合理布局说简单也简单,说难也有点儿高难度,看了许多人的网站首页,发觉他们网站首页的网站关键词根本没做好合理布局,只是在主页设置了有几个网站关键词,或者你可能会说:我这种是企业网站,没具体方法与商业网站对比!那么你就想错了,网站关键词的合理布局是为了更好地增加网站首页的关联性,...

开淘宝店铺卖食品的保证金是多少(淘宝做食品类的保证金是多少)

开淘宝店铺卖食品的保证金是多少(淘宝做食品类的保证金是多少)

开店成本比较低,但是运营就看你的预算。开店成本也就1k元保证金。运营成本初期不建议大量广告投入,先做基础销量,配合小额度广告投入,基础销量起来之后再加大力度广告投入。...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片