目录
春眠不觉晓,处处闻啼鸟。 夜来风雨声,花落知多少。
1. 使用
- 创建分类文件
UIButton+FQTimeButton.h
#import <UIKit/UIKit.h>
#define defaultInterval 2.0// 默认间隔时间
@interface UIButton (FQTimeButton)
// 设置点击时间间隔
@property (nonatomic, assign) NSTimeInterval timeInterVal;
@end
UIButton+FQTimeButton.m
#import "UIButton+FQTimeButton.h"
@interface UIButton()
// 用来判断 是否去执行方法
@property (nonatomic, assign) BOOL isExcuteEvent;
@end
@implementation UIButton (FQTimeButton)
// main方法之前会调用d所有类的load方法
+ (void)load{
// 仅执行一次,避免多次替换出错
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// 交换自定义方法和系统方法
SEL oldSel = @selector(sendAction:to:forEvent:);
SEL newSel = @selector(newSendAction:to:forEvent:);
Method oldMethod = class_getInstanceMethod(self, oldSel);
Method newMethod = class_getInstanceMethod(self, newSel);
BOOL isAdd = class_addMethod(self, oldSel, method_getImplementation(newMethod), method_getTypeEncoding(newMethod));
if (isAdd) {
class_replaceMethod(self, newSel, method_getImplementation(oldMethod), method_getTypeEncoding(oldMethod));
}else{
method_exchangeImplementations(oldMethod, newMethod);
}
});
}
// 触发按钮事件时会调用
- (void)newSendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event{
if ([NSStringFromClass(self.class) isEqualToString:@"UIButton"]) {
if (self.isExcuteEvent == 0) {
self.timeInterVal = self.timeInterVal = 0? defaultInterval:self.timeInterVal;
}
if (self.isExcuteEvent) return;
if (self.timeInterVal > 0) {
self.isExcuteEvent = true;
[self performSelector:@selector(setIsExcuteEvent:) withObject:nil afterDelay:self.timeInterVal];
}
}
[self newSendAction:action to:target forEvent:event];
}
// 动态关联属性
- (NSTimeInterval)timeInterVal{
return [objc_getAssociatedObject(self, _cmd) doubleValue];
}
- (void)setTimeInterVal:(NSTimeInterval)timeInterVal{
objc_setAssociatedObject(self, @selector(timeInterVal), @(timeInterVal), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (void)setIsExcuteEvent:(BOOL)isExcuteEvent{
objc_setAssociatedObject(self, @selector(isExcuteEvent), @(isExcuteEvent), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (BOOL)isExcuteEvent{
return [objc_getAssociatedObject(self, _cmd) boolValue];
}
@end
- 使用
#import "UIButton+FQTimeButton.h"
-(UIButton *)saveButton{
if(!_saveButton){
_saveButton=[UIButton new];
[_saveButton setTimeInterVal:3.5]; // 设置3.5秒内不可重复点击
[_saveButton setTitle:@"保存" forState:UIControlStateNormal];
[_saveButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[_saveButton.titleLabel setFont:kFontBold(14)];
[_saveButton setBackgroundColor:[UIColor colorWithHex:0xFB5752]];
[_saveButton.layer setMasksToBounds:true];
[_saveButton.layer setCornerRadius:kEstimateWidth(50)/2.0];
[_saveButton addTarget:self action:@selector(fq_handleSave:) forControlEvents:UIControlEventTouchUpInside];
}
return _saveButton;
}
网友评论