美文网首页
iOS【运行时点击事件延迟】

iOS【运行时点击事件延迟】

作者: NJ_墨 | 来源:发表于2018-03-05 10:03 被阅读17次

摘录:iOS高级开发runtime那点事实战(1)
示例

#import <UIKit/UIKit.h>

@interface UIControl (Event)
@property(nonatomic,assign) NSTimeInterval acceptEventInterval;
@property(nonatomic)BOOL ignoreEvent;

@end

// ========================= //
#import "UIControl+Event.h"
#import <objc/runtime.h>

static const char *UIControl_acceptEventInterval = "UIControl_acceptEventInterval";
static const char *UIControl_ignoreEvent = "UIControl_ignoreEvent";

@implementation UIControl (Event)

/**
 * 动态添加两个属性
 * 
 */
- (void)setAcceptEventInterval:(NSTimeInterval)acceptEventInterval
{
    objc_setAssociatedObject(self,UIControl_acceptEventInterval, @(acceptEventInterval), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(NSTimeInterval)acceptEventInterval {
    return[objc_getAssociatedObject(self,UIControl_acceptEventInterval) doubleValue];
}
-(void)setIgnoreEvent:(BOOL)ignoreEvent{
    objc_setAssociatedObject(self,UIControl_ignoreEvent, @(ignoreEvent), OBJC_ASSOCIATION_ASSIGN);
}
-(BOOL)ignoreEvent{
    return[objc_getAssociatedObject(self,UIControl_ignoreEvent) boolValue];
}

/**
 * 交换点击事件的方法
 */
+(void)load {
    Method old = class_getInstanceMethod(self,@selector(sendAction:to:forEvent:));
    Method new = class_getInstanceMethod(self,@selector(_sendAction:to:forEvent:));
    
    BOOL didAddMethod = class_addMethod(self, @selector(sendAction:to:forEvent:), method_getImplementation(new), method_getTypeEncoding(new));
    
    if (didAddMethod) {
        class_replaceMethod(self,  @selector(_sendAction:to:forEvent:), method_getImplementation(old), method_getTypeEncoding(old));
    }
    else {
        method_exchangeImplementations(old, new);
    }

    
}
- (void)_sendAction:(SEL)action to:(id)target forEvent:(UIEvent*)event
{
    if(self.ignoreEvent)return;
    if(self.acceptEventInterval>0)
    {
        self.ignoreEvent=YES;
        [self performSelector:@selector(setIgnoreEventWithNo) withObject:nil afterDelay:self.acceptEventInterval];
    }
    [self _sendAction:action to:target forEvent:event];
}
-(void)setIgnoreEventWithNo{
    self.ignoreEvent=NO;
}

@end

_oneBtn =[[UIButton alloc]initWithFrame:CGRectMake(100,100,150,40)];
    [_oneBtn setTitle:@"点击时间间隔"forState:UIControlStateNormal];
    [_oneBtn setTitleColor:[UIColor redColor]forState:UIControlStateNormal];
    _oneBtn.acceptEventInterval =3;
    [self.view addSubview:_oneBtn];
    [_oneBtn addTarget:self action:@selector(btnEvent)forControlEvents:UIControlEventTouchUpInside];

相关文章

网友评论

      本文标题:iOS【运行时点击事件延迟】

      本文链接:https://www.haomeiwen.com/subject/whbcfftx.html