摘录: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];
网友评论