// // UIButton+LMUtils.m // LMUtils // // Created by hl on 2018/4/17. // Copyright © 2018年 lam. All rights reserved. // #import "UIButton+LMUtils.h" #import static NSTimeInterval const kDefaultEventInterval = .5f; static NSArray *_IgnoreButtonsClasss = nil; static NSArray *_IgnoreTargetsClasss = nil; @implementation UIButton (LMUtils) + (void)setIgnoreButtons:(NSArray *)ignoreButtons { if (_IgnoreButtonsClasss != ignoreButtons) { _IgnoreButtonsClasss = ignoreButtons.copy; } } + (NSArray *)ignoreButtons { if (_IgnoreButtonsClasss) { return _IgnoreButtonsClasss; } return @[]; } + (void)setIgnoreTargets:(NSArray *)ignoreTargets { if (_IgnoreTargetsClasss != ignoreTargets) { _IgnoreTargetsClasss = ignoreTargets.copy; } } + (NSArray *)ignoreTargets { if (_IgnoreTargetsClasss) { return _IgnoreTargetsClasss; } return @[]; } + (void)load { @autoreleasepool { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ Class class = [self class]; SEL originalSelector = @selector(sendAction:to:forEvent:); SEL swizzledSelector = @selector(lm_sendAction:to:forEvent:); Method originalMethod = class_getInstanceMethod(class, originalSelector); Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector); if (class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))) { class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)); } else { method_exchangeImplementations(originalMethod, swizzledMethod); } }); } } static const char *UIButton_acceptEventInterval = "UIButton_acceptEventInterval"; - (NSTimeInterval)acceptEventInterval { NSNumber *number = objc_getAssociatedObject(self, UIButton_acceptEventInterval); if (number) { return [number doubleValue]; } return kDefaultEventInterval; } - (void)setAcceptEventInterval:(NSTimeInterval)acceptEventInterval { objc_setAssociatedObject(self, UIButton_acceptEventInterval, @(acceptEventInterval), OBJC_ASSOCIATION_RETAIN_NONATOMIC); } static const char *UIControl_ignoreEvent = "UIControl_ignoreEvent"; - (BOOL)ignoreEvent { return [objc_getAssociatedObject(self, UIControl_ignoreEvent) doubleValue]; } - (void)setIgnoreEvent:(BOOL)ignoreEvent{ objc_setAssociatedObject(self, UIControl_ignoreEvent, @(ignoreEvent), OBJC_ASSOCIATION_RETAIN_NONATOMIC); } - (void)lm_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event { NSObject *targetObj = target; NSString *classString = NSStringFromClass(self.class); NSString *targetClassStr = NSStringFromClass(targetObj.class); if (![[self.class ignoreTargets] containsObject:targetClassStr]) { if ([self isMemberOfClass:[UIButton class]] || [[self.class ignoreButtons] containsObject:classString]) { if (self.ignoreEvent) { return; } if (self.acceptEventInterval > 0) { self.ignoreEvent = YES; __weak typeof(self) weakSelf = self; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(self.acceptEventInterval * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ __strong typeof(weakSelf) strongSelf = weakSelf; if(!strongSelf)return; strongSelf.ignoreEvent = NO; }); } } } [self lm_sendAction:action to:target forEvent:event]; } @end @implementation UIButton (LMCreate) - (void)setTitle:(NSString *)title titleColor:(UIColor *)color font:(UIFont *)font image:(UIImage *)image backgroundImage:(UIImage *)backgroundImage forState:(UIControlState) state { [self setTitle:title forState:state]; [self setTitleColor:color forState:state]; [[self titleLabel] setFont:font]; [self setImage:image forState:state]; [self setBackgroundImage:backgroundImage forState:state]; } @end