按钮防重点击

197 阅读1分钟

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

/// 防重复点击按钮

@interface DelayButton : UIButton

/// 创建防重复点击按钮

/// @param buttonType 按钮类型

/// @param delay 延迟时间

  • (instancetype)buttonWithType:(UIButtonType)buttonType delay:(NSTimeInterval)delay;

/// 创建防重复点击按钮(默认1s)

/// @param buttonType 按钮类型

  • (instancetype)buttonWithType:(UIButtonType)buttonType;

@end

NS_ASSUME_NONNULL_END

#import "DelayButton.h"

static NSInteger kDefaultDelay = 1;

@interface DelayButton ()

@property (nonatomic, assign) NSTimeInterval delay;

@end

@implementation DelayButton

/// 创建防重复点击按钮

/// @param buttonType 按钮类型

/// @param delay 延迟时间

  • (instancetype)buttonWithType:(UIButtonType)buttonType

                         delay:(NSTimeInterval)delay {

    DelayButton *button = [super buttonWithType:(buttonType)];

    button.delay = delay;

    return button;

}

  • (instancetype)initWithFrame:(CGRect)frame {

    self = [super initWithFrame:frame];

    if (self) {

        self.delay = kDefaultDelay;

    }

    return self;

}

/// 创建防重复点击按钮(默认1s)

/// @param buttonType 按钮类型

  • (instancetype)buttonWithType:(UIButtonType)buttonType {

    return [self buttonWithType:buttonType delay:kDefaultDelay];

}

  • (void)sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event {    self.userInteractionEnabled = NO;

    __weak typeof(self) weakSelf = self;

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(self.delay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

         weakSelf.userInteractionEnabled = YES;

    });

    [super sendAction:action to:target forEvent:event];

}

@end