美文网首页开发技术
iOS UIButton防止被重复点击

iOS UIButton防止被重复点击

作者: 打不死的小怪兽 | 来源:发表于2017-10-26 13:40 被阅读231次

    一、避免屏幕内多个button被同时点击

    方法一、在AppDelegate中添加 [[UIButton appearance] setExclusiveTouch:YES];
    方法二、每新建button都设置button.exclusiveTouch = YES;

    二、避免一个button被多次点击

    使用runtime,一劳永逸 我这设的是0.5秒内不会被重复点击

    1、导入objc/runtime.h(放在了pch文件里)。
    2、创建UIControlUIButton的分类。

    .h文件
    .m文件 具体实现
    具体代码如下
    #import
    
    #define defaultInterval.5//默认时间间隔
    
    @interfaceUIControl (UIControl_buttonCon)
    
    @property(nonatomic,assign)NSTimeIntervaltimeInterval;//用这个给重复点击加间隔
    
    @property(nonatomic,assign)BOOLisIgnoreEvent;//YES不允许点击NO允许点击
    
    @end
    
    #import"UIControl+UIControl_buttonCon.h"
    
    @implementationUIControl (UIControl_buttonCon)
    
    - (NSTimeInterval)timeInterval {
           return[objc_getAssociatedObject(self,_cmd)doubleValue];
    }
    
    - (void)setTimeInterval:(NSTimeInterval)timeInterval {
          objc_setAssociatedObject(self,@selector(timeInterval),@(timeInterval),OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    
    //runtime动态绑定属性
    
    - (void)setIsIgnoreEvent:(BOOL)isIgnoreEvent{    
         objc_setAssociatedObject(self,@selector(isIgnoreEvent),@(isIgnoreEvent),OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    
    - (BOOL)isIgnoreEvent{
         return[objc_getAssociatedObject(self,_cmd)boolValue];
    }
    
    - (void)resetState{
         [selfsetIsIgnoreEvent:NO];
    }
    
    + (void)load{
    
        staticdispatch_once_tonceToken;
    
        dispatch_once(&onceToken, ^{
    
              SELselA =@selector(sendAction:to:forEvent:);
    
              SELselB =@selector(mySendAction:to:forEvent:);
    
              MethodmethodA =class_getInstanceMethod(self, selA);
    
              MethodmethodB =class_getInstanceMethod(self, selB);
    
              //将methodB的实现添加到系统方法中也就是说将methodA方法指针添加成方法methodB的返回值表示是否添加成功
    
              BOOLisAdd =class_addMethod(self, selA,method_getImplementation(methodB),method_getTypeEncoding(methodB));
    
              //添加成功了说明本类中不存在methodB所以此时必须将方法b的实现指针换成方法A的,否则b方法将没有实现。
    
              if(isAdd) {
    
                  class_replaceMethod(self, selB,method_getImplementation(methodA),method_getTypeEncoding(methodA));
    
              }else{
                  //添加失败了说明本类中有methodB的实现,此时只需要将methodA和methodB的IMP互换一下即可。
                  method_exchangeImplementations(methodA, methodB);
              }
    
        });
    
    }
    
    - (void)mySendAction:(SEL)action to:(id)target forEvent:(UIEvent*)event {
         if([NSStringFromClass(self.class)isEqualToString:@"UIButton"]) {
              self.timeInterval=self.timeInterval==0?defaultInterval:self.timeInterval;
              if(self.isIgnoreEvent) {
                   return;
              }elseif(self.timeInterval>0){
                    [self performSelector:@selector(resetState)withObject:nilafterDelay:self.timeInterval];
              }
        }
    
        //此处methodA和methodB方法IMP互换了,实际上执行sendAction;所以不会死循环
        self.isIgnoreEvent=YES;
        [self mySendAction:actionto:targetforEvent:event];
    
    }
    
    @end
    

    相关文章

      网友评论

        本文标题:iOS UIButton防止被重复点击

        本文链接:https://www.haomeiwen.com/subject/yvohpxtx.html