推广

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

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

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://www.0291.com.cn/post/56762.html

相关文章

浅谈百度百科的推广技巧。

浅谈百度百科的推广技巧。

百度作为国内最大搜索引擎,在搜索关键词的时候,只要百度知道、百度百科里有的内容,都会出现在搜索结果页的前排,权重之高。那要是去百度百科做推广能带来什么好处呢?怎样利用百度百科这个平台推广自己的产品、网站呢? 百度百科推广的三大益处 1、增加高质量的外部链接 百度对自己的产品照顾有加,给予了很高...

淘宝客定向计划多久生效(淘宝定向计划手动审核在哪里)

淘宝客定向计划多久生效(淘宝定向计划手动审核在哪里)

一般今天开通次日可以生效。定向推广计划是卖家为淘宝客中某一个细分群体设置的推广计划,可以让淘宝客在阿里妈妈前台看到推广并吸引淘宝客参加。...

北京十大拆迁律师事务所榜单

北京十大拆迁律师事务所榜单大多数被拆迁人在听说可以找律师起诉行政机关,都觉得赢的概率比较小,不可否认,大多数人都是有这种固有思想的,这样一来,就导致了很多被拆迁人没能够得到合理的补偿。那么,现实中,律师帮忙被拆迁人打官司真的很难赢吗?该不该请律师呢?首先很难赢这个是一种错觉...

Keep产品运营分析

Keep产品运营分析

  本文是keep的产品分析报告,作者从市场分析、用户人群、产品功能、竞品分析、产品迭代和未来产品优化这几个方面对keep展开了分析,并总结了自己的相关思考和建议,与大家分享。 Keep,一款为用户解决运动健身需求并具有一定社交属性的APP。 作为一个健身爱好者,使用Kee...

我们来看看漂亮的小姐姐都是怎样做竞价的。

我们来看看漂亮的小姐姐都是怎样做竞价的。

大家好,最近我很苦恼。 我曾是一个苦逼的竞价员,每天最大的爱好就是调戏竞争对手的小哥哥。有一天他突然有了女票,于是我一怒之下跳槽到了“厚昌学院”。 于是我的烦恼开始了。他们都说厚昌只招聘专业人才,他们还说我肯定是凭着年轻貌美进来的。 好气哦~难道就因为我比较年轻吗。于是,在我的努力之下,短...

企业经营策略(宋志平:后疫情时代企业的布局与经营)。

企业经营策略(宋志平:后疫情时代企业的布局与经营)。

中国上市公司协会会长、中国企业改革与发展研究会会长、总裁读书会全国领读者联盟主席 宋志平 题记:本文由总裁读书会整理及首发,选编自《经营制胜:清华管理公开课》一书,作者宋志平,现任中国上市公司协会会长、中国企业改革与发展研究会会长、总裁读书会全国领读者联盟主席。作为杰出的央企领导人,宋志...

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

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