UIButton+LMUtils.m 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. //
  2. // UIButton+LMUtils.m
  3. // LMUtils
  4. //
  5. // Created by hl on 2018/4/17.
  6. // Copyright © 2018年 lam. All rights reserved.
  7. //
  8. #import "UIButton+LMUtils.h"
  9. #import <objc/runtime.h>
  10. static NSTimeInterval const kDefaultEventInterval = .5f;
  11. static NSArray *_IgnoreButtonsClasss = nil;
  12. static NSArray *_IgnoreTargetsClasss = nil;
  13. @implementation UIButton (LMUtils)
  14. + (void)setIgnoreButtons:(NSArray<NSString *> *)ignoreButtons {
  15. if (_IgnoreButtonsClasss != ignoreButtons) {
  16. _IgnoreButtonsClasss = ignoreButtons.copy;
  17. }
  18. }
  19. + (NSArray<NSString *> *)ignoreButtons {
  20. if (_IgnoreButtonsClasss) {
  21. return _IgnoreButtonsClasss;
  22. }
  23. return @[];
  24. }
  25. + (void)setIgnoreTargets:(NSArray<NSString *> *)ignoreTargets {
  26. if (_IgnoreTargetsClasss != ignoreTargets) {
  27. _IgnoreTargetsClasss = ignoreTargets.copy;
  28. }
  29. }
  30. + (NSArray<NSString *> *)ignoreTargets {
  31. if (_IgnoreTargetsClasss) {
  32. return _IgnoreTargetsClasss;
  33. }
  34. return @[];
  35. }
  36. + (void)load {
  37. @autoreleasepool {
  38. static dispatch_once_t onceToken;
  39. dispatch_once(&onceToken, ^{
  40. Class class = [self class];
  41. SEL originalSelector = @selector(sendAction:to:forEvent:);
  42. SEL swizzledSelector = @selector(lm_sendAction:to:forEvent:);
  43. Method originalMethod = class_getInstanceMethod(class, originalSelector);
  44. Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
  45. if (class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))) {
  46. class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
  47. } else {
  48. method_exchangeImplementations(originalMethod, swizzledMethod);
  49. }
  50. });
  51. }
  52. }
  53. static const char *UIButton_acceptEventInterval = "UIButton_acceptEventInterval";
  54. - (NSTimeInterval)acceptEventInterval {
  55. NSNumber *number = objc_getAssociatedObject(self, UIButton_acceptEventInterval);
  56. if (number) {
  57. return [number doubleValue];
  58. }
  59. return kDefaultEventInterval;
  60. }
  61. - (void)setAcceptEventInterval:(NSTimeInterval)acceptEventInterval
  62. {
  63. objc_setAssociatedObject(self, UIButton_acceptEventInterval, @(acceptEventInterval), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  64. }
  65. static const char *UIControl_ignoreEvent = "UIControl_ignoreEvent";
  66. - (BOOL)ignoreEvent {
  67. return [objc_getAssociatedObject(self, UIControl_ignoreEvent) doubleValue];
  68. }
  69. - (void)setIgnoreEvent:(BOOL)ignoreEvent{
  70. objc_setAssociatedObject(self, UIControl_ignoreEvent, @(ignoreEvent), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  71. }
  72. - (void)lm_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event {
  73. NSObject *targetObj = target;
  74. NSString *classString = NSStringFromClass(self.class);
  75. NSString *targetClassStr = NSStringFromClass(targetObj.class);
  76. if (![[self.class ignoreTargets] containsObject:targetClassStr]) {
  77. if ([self isMemberOfClass:[UIButton class]] || [[self.class ignoreButtons] containsObject:classString]) {
  78. if (self.ignoreEvent) {
  79. return;
  80. }
  81. if (self.acceptEventInterval > 0) {
  82. self.ignoreEvent = YES;
  83. __weak typeof(self) weakSelf = self;
  84. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(self.acceptEventInterval * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  85. __strong typeof(weakSelf) strongSelf = weakSelf;
  86. if(!strongSelf)return;
  87. strongSelf.ignoreEvent = NO;
  88. });
  89. }
  90. }
  91. }
  92. [self lm_sendAction:action to:target forEvent:event];
  93. }
  94. @end
  95. @implementation UIButton (LMCreate)
  96. - (void)setTitle:(NSString *)title
  97. titleColor:(UIColor *)color
  98. font:(UIFont *)font
  99. image:(UIImage *)image
  100. backgroundImage:(UIImage *)backgroundImage
  101. forState:(UIControlState) state {
  102. [self setTitle:title forState:state];
  103. [self setTitleColor:color forState:state];
  104. [[self titleLabel] setFont:font];
  105. [self setImage:image forState:state];
  106. [self setBackgroundImage:backgroundImage forState:state];
  107. }
  108. @end