因?yàn)闃I(yè)務(wù)中經(jīng)常要用到button的事件點(diǎn)擊,但是習(xí)慣了BlockKit和RAC的高聚合事件點(diǎn)擊寫(xiě)法以后,感覺(jué)方法要跳來(lái)跳去太麻煩了,特意寫(xiě)一個(gè)分類來(lái)修改這個(gè)弊端,這個(gè)分類還包括了一下功能:
1. addTarget點(diǎn)擊事件
2. 按鈕倒計(jì)時(shí)
3. 重新排布image和label的位置
主要代碼如下:
.h
#import <UIKit/UIKit.h>
@interface UIButton (XHAdd)
//button中image和label的相對(duì)位置
typedef enum : NSUInteger{
XHButtonImageLocatedLabelTop,
XHButtonImageLocatedLabelButtom,
XHButtonImageLocatedLabelLeft,
XHButtonImageLocatedLabelRight
}XHButtonImageLocatedLabelEnum;
//設(shè)置使得圖片和文字的位置改變
-(void)xh_ButtonImageLocatedLabel:(XHButtonImageLocatedLabelEnum)located whitSpace:(CGFloat)space;
//設(shè)置button在一定時(shí)間間隔內(nèi)不能再次點(diǎn)擊
-(void)xh_buttonBanWithTheCountdown:(int)time;
//設(shè)置某種點(diǎn)擊事件后的回調(diào)
-(void)xh_blockWhitControlEvents:(UIControlEvents)ControlEvents block:(void(^)())block;
@end
.m
#import "UIButton+XHAdd.h"
#import "NSTimer+XHAdd.h"
#import <objc/runtime.h>
typedef void(^ButtonClikcBlock)();
@interface UIButton()
@property (nonatomic ,copy ) ButtonClikcBlock block;
@end
@implementation UIButton (HXAdd)
-(void)xh_ButtonImageLocatedLabel:(XHButtonImageLocatedLabelEnum)located whitSpace:(CGFloat)space{
// NSLog(@"label:%@,imageView:%@",self.titleLabel,self.imageView);
CGFloat imageWidth = self.imageView.frame.size.height;
CGFloat imageHeight = self.imageView.frame.size.width;
CGFloat labelWidth = 0.0;
CGFloat labelHeight = 0.0;
if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) {
// 由于iOS8中titleLabel的size為0,用下面的這種設(shè)置
labelWidth = self.titleLabel.intrinsicContentSize.width;
labelHeight = self.titleLabel.intrinsicContentSize.height;
}else{
labelWidth = self.titleLabel.frame.size.width;
labelHeight = self.titleLabel.frame.size.height;
}
// 2. 聲明全局的imageEdgeInsets和labelEdgeInsets
UIEdgeInsets imageEdgeInsets = UIEdgeInsetsZero;
UIEdgeInsets labelEdgeInsets = UIEdgeInsetsZero;
// 3. 根據(jù)style和space得到imageEdgeInsets和labelEdgeInsets的值
switch (located) {
case XHButtonImageLocatedLabelTop:{
imageEdgeInsets = UIEdgeInsetsMake(-labelHeight-space/2.0, 0, 0, -labelWidth);
labelEdgeInsets = UIEdgeInsetsMake(0, -imageWidth, -imageHeight-space/2.0, 0);
}
break;
case XHButtonImageLocatedLabelButtom:{
imageEdgeInsets = UIEdgeInsetsMake(0, 0, -labelHeight-space/2.0, -labelWidth);
labelEdgeInsets = UIEdgeInsetsMake(-imageHeight-space/2.0, -imageWidth, 0, 0);
}
break;
case XHButtonImageLocatedLabelLeft:{
imageEdgeInsets = UIEdgeInsetsMake(0, -space/2.0, 0, space/2.0);
labelEdgeInsets = UIEdgeInsetsMake(0, space/2.0, 0, -space/2.0);
}
break;
case XHButtonImageLocatedLabelRight:{
imageEdgeInsets = UIEdgeInsetsMake(0, labelWidth+space/2.0, 0, -labelWidth-space/2.0);
labelEdgeInsets = UIEdgeInsetsMake(0, -imageWidth-space/2.0, 0, imageWidth+space/2.0);
}
break;
}
// 4. 賦值
self.titleEdgeInsets = labelEdgeInsets;
self.imageEdgeInsets = imageEdgeInsets;
}
-(void)xh_buttonBanWithTheCountdown:(int)time{
//1.禁止按鈕多次點(diǎn)擊
self.enabled = NO;
__block int count = time;
//2. 設(shè)置時(shí)間
[self setTitle:[NSString stringWithFormat:@"%ds",count] forState:UIControlStateDisabled];
//3. 開(kāi)始倒計(jì)時(shí)(此處使用了NSTimer的分類來(lái)防止忘記取消定時(shí)器造成的其他影響)
__block NSTimer* timer = [NSTimer xh_scheduledTimerWithTimeInterval:1 block:^{
if (count <= 0) {
//5.銷(xiāo)毀定時(shí)器
[timer invalidate];
timer = nil;
self.enabled = YES;
}else{
//4. 設(shè)置倒計(jì)時(shí)
count--;
[self setTitle:[NSString stringWithFormat:@"%ds",count] forState:UIControlStateDisabled];
}
} repeats:YES];
}
//addTarget事件
-(void)xh_blockWhitControlEvents:(UIControlEvents)ControlEvents block:(void(^)())block{
[self addTarget:self action:@selector(xh_buttonClick:) forControlEvents:ControlEvents];
self.block = block;
}
-(void)xh_buttonClick:(UIButton*)button{
if (self.block) {
self.block();
}
}
#pragma set/get
-(void)setBlock:(ButtonClikcBlock)block{
if (block) {
objc_setAssociatedObject(self, _cmd, block, OBJC_ASSOCIATION_COPY);
}
}
-(ButtonClikcBlock)block{
return objc_getAssociatedObject(self, @selector(setBlock:));
}
@end