#import <UIKitの/ UIKit.h> に#define defaultInterval 0.5 // デフォルトの間隔 @interface UIButton(タッチ) / * *設定された時間間隔をクリックします* / @Property(非アトミック、ASSIGN)NSTimeInterval時間間隔; @end
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#importを " UIButton +のtouch.h " の#import <にObjC / runtime.h> @interface UIButton() / * * BOOL类型设置是否执行点UI方法* / @property(非アトミック、割り当てる)BOOL isIgnoreEvent。@end @implementation UIButton(タッチ) +(ボイド)負荷{ 静的dispatch_once_t onceToken。 dispatch_once(&onceToken、^ { SEL SELA = @selector(sendAction:全forEvent :); SEL SELB = @selector(mySendAction:全forEvent :); 方法methodA = class_getInstanceMethod(自己、SELA)。 方法methodB =class_getInstanceMethod(自己、SELB)。 BOOL isAdd = class_addMethod(自己、SELA、method_getImplementation(methodB)、method_getTypeEncoding(methodB))。 もし(isAdd){ class_replaceMethod(自己、SELB、method_getImplementation(methodA)、method_getTypeEncoding(methodA))。 } 他{ method_exchangeImplementations(methodA、methodB)。 } })。 } - (NSTimeInterval)時間間隔 { リターン[objc_getAssociatedObject(自己、_CMD)のdoubleValue]。 } - (ボイド)setTimeInterval:(NSTimeInterval)時間間隔 { objc_setAssociatedObject(自己、@selector(時間間隔)、@(時間間隔)、OBJC_ASSOCIATION_RETAIN_NONATOMIC)。 } - (ボイド)mySendAction:(SEL):(するアクションIDを forEventターゲット):(たUIEvent *)イベントを { 場合([。NSStringFromClass(自己クラス)isEqualToString:@ " UIButton " ]){ 場合(self.isIgnoreEvent == 0 ){ self.timeInterval = defaultInterval。 }。 もし(self.isIgnoreEvent)リターン。 もし(self.timeInterval> 0 ) { self.isIgnoreEvent = YES。 [自己performSelector:@selector(setIsIgnoreEvent :) withObject:@(NO)afterDelay:self.timeInterval]。 } } [自己mySendAction:アクションへ:ターゲットforEvent:イベント]。 } - (ボイド)setIsIgnoreEvent:(BOOL)isIgnoreEvent { objc_setAssociatedObject(自己、@selector(isIgnoreEvent)、@(isIgnoreEvent)、OBJC_ASSOCIATION_RETAIN_NONATOMIC)。 } - (BOOL)isIgnoreEvent { 戻り[objc_getAssociatedObject(自己、_CMD)BOOLVALUE]。 } @end