iOS 버튼 폭력 클릭 의 편리 한 해결 방안 을 자세히 알 아 보 세 요.

iOS 클릭 이벤트 분류
1.프로그램 에서 대량의 단 추 를 연속 으로 응답 하 는 검 사 를 하지 않 았 습 니 다.테스트 인원 이 연속 으로 클릭 하면 불필요 한 문제 가 많이 발생 하기 때문에 실행 시의 특성 을 이용 하여 hook 을 할 수 밖 에 없습니다.런 타임 은 대량으로 사용 할 수 없 지만 가끔 사용 하 는 것 도 편리 합 니 다.하하.
2.훅 이 필요 없 는 단일 버튼 설정
3.버튼 을 여러 번 누 르 고 마지막 클릭 이벤트 만 실행 하 며 앞의 클릭 시간 을 무시 합 니 다.

//// UIButton+touch.h
// LiqForDoctors
#import#define defaultInterval .5 //      

@interface UIButton (touch)

/**        */

@property (nonatomic, assign) NSTimeInterval timeInterval;

@end

//
// UIButton+touch.m
// LiqForDoctors
//

#import "UIButton+touch.h"
@interface UIButton()
/**bool    YES       NO             UI  */
@property (nonatomic, assign) BOOL isIgnoreEvent;
@end
@implementation UIButton (touch)
+ (void)load{
 static dispatch_once_t onceToken;
 dispatch_once(&onceToken, ^{
  SEL selA = @selector(sendAction:to:forEvent:);
  SEL selB = @selector(mySendAction:to:forEvent:);
  Method methodA = class_getInstanceMethod(self,selA);
  Method methodB = class_getInstanceMethod(self, selB);
  //  methodB                    methodA          methodB             
  BOOL isAdd = class_addMethod(self, selA, method_getImplementation(methodB), method_getTypeEncoding(methodB));
  //               methodB          b         A ,   b       。
  if (isAdd) {
   class_replaceMethod(self, selB, method_getImplementation(methodA), method_getTypeEncoding(methodA));
  }else{
   //             methodB   ,       methodA methodB IMP      。
   method_exchangeImplementations(methodA, methodB);
  }
 });
}
- (NSTimeInterval)timeInterval
{
 return [objc_getAssociatedObject(self, _cmd) doubleValue];
}
- (void)setTimeInterval:(NSTimeInterval)timeInterval
{
 objc_setAssociatedObject(self, @selector(timeInterval), @(timeInterval), OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}
//          sendAction        mySendAction
- (void)mySendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event
{
 if ([NSStringFromClass(self.class) isEqualToString:@"UIButton"]) {

  self.timeInterval =self.timeInterval ==0 ?defaultInterval:self.timeInterval;
  if (self.isIgnoreEvent){
   return;
  }else if (self.timeInterval > 0){
   [self performSelector:@selector(resetState) withObject:nil afterDelay:self.timeInterval];
  }
 }
 //   methodA methodB  IMP   ,      sendAction;       
 self.isIgnoreEvent = YES;
 [self mySendAction:action to:target forEvent:event];
}
//runtime        
- (void)setIsIgnoreEvent:(BOOL)isIgnoreEvent{
 //   BOOL      OBJC_ASSOCIATION_RETAIN_NONATOMIC     ,  set       
 objc_setAssociatedObject(self, @selector(isIgnoreEvent), @(isIgnoreEvent), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (BOOL)isIgnoreEvent{
 //_cmd == @select(isIgnore);  set     
 return [objc_getAssociatedObject(self, _cmd) boolValue];
}
- (void)resetState{
 [self setIsIgnoreEvent:NO];
}
@end

demo 다운로드:demo
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기