123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- //
- // UIButton+LMUtils.m
- // LMUtils
- //
- // Created by hl on 2018/4/17.
- // Copyright © 2018年 lam. All rights reserved.
- //
- #import "UIButton+LMUtils.h"
- #import <objc/runtime.h>
- static NSTimeInterval const kDefaultEventInterval = .5f;
- static NSArray *_IgnoreButtonsClasss = nil;
- static NSArray *_IgnoreTargetsClasss = nil;
- @implementation UIButton (LMUtils)
- + (void)setIgnoreButtons:(NSArray<NSString *> *)ignoreButtons {
- if (_IgnoreButtonsClasss != ignoreButtons) {
- _IgnoreButtonsClasss = ignoreButtons.copy;
- }
- }
- + (NSArray<NSString *> *)ignoreButtons {
- if (_IgnoreButtonsClasss) {
- return _IgnoreButtonsClasss;
- }
- return @[];
- }
- + (void)setIgnoreTargets:(NSArray<NSString *> *)ignoreTargets {
- if (_IgnoreTargetsClasss != ignoreTargets) {
- _IgnoreTargetsClasss = ignoreTargets.copy;
- }
- }
- + (NSArray<NSString *> *)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
|