UIControl+NXCategory.m 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. //
  2. // UIControl+acceptEventInterval.m
  3. // NXlib
  4. //
  5. // Created by AK on 15/9/15.
  6. // Copyright (c) 2015年 AK. All rights reserved.
  7. //
  8. #import "UIControl+NXCategory.h"
  9. #if TARGET_OS_IPHONE
  10. #import <objc/message.h>
  11. #import <objc/runtime.h>
  12. #else
  13. #import <objc/objc-class.h>
  14. #endif
  15. @implementation UIControl (NXCategory)
  16. static const char *UIControl_acceptEventInterval = "UIControl_acceptEventInterval";
  17. static const char *UIControl_ignoreEvent = "UIControl_ignoreEvent";
  18. //改变两个方法的实现。在类第一次使用的时候回调用这个方法
  19. + (void)load
  20. {
  21. Method a = class_getInstanceMethod(self, @selector(sendAction:to:forEvent:));
  22. Method b = class_getInstanceMethod(self, @selector(__uxy_sendAction:to:forEvent:));
  23. //改变两个方法的实现
  24. method_exchangeImplementations(a, b); // isnt
  25. }
  26. //通过关联对象重写get和set方法
  27. - (NSTimeInterval)uxy_acceptEventInterval
  28. {
  29. return [objc_getAssociatedObject(self, UIControl_acceptEventInterval) doubleValue];
  30. }
  31. - (void)setUxy_acceptEventInterval:(NSTimeInterval)uxy_acceptEventInterval
  32. {
  33. objc_setAssociatedObject(self, UIControl_acceptEventInterval, @(uxy_acceptEventInterval),
  34. OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  35. }
  36. #pragma mark 现在是否可点的get和set。通过关联对象。
  37. - (void)setIgnoreEvent:(BOOL)ignoreEvent
  38. {
  39. objc_setAssociatedObject(self, UIControl_ignoreEvent, @(ignoreEvent), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  40. }
  41. - (BOOL)ignoreEvent { return [objc_getAssociatedObject(self, UIControl_ignoreEvent) boolValue]; }
  42. - (void)__uxy_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event
  43. {
  44. if (self.ignoreEvent)
  45. {
  46. NSLog(@"无效点击!!!!!!!!!!");
  47. return;
  48. }
  49. if (self.uxy_acceptEventInterval > 0)
  50. {
  51. self.ignoreEvent = YES;
  52. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(self.uxy_acceptEventInterval * NSEC_PER_SEC)),
  53. dispatch_get_main_queue(), ^{
  54. self.ignoreEvent = NO;
  55. });
  56. }
  57. //调用系统实现
  58. [self __uxy_sendAction:action to:target forEvent:event];
  59. }
  60. @end