ios实用开发技巧

iOS 避免按钮快速点击出现多次跳转

2016-09-01  本文已影响0人  StevenF

如下代码:创建一个UIControl的分类UIControl (Extension)

#import<UIKit/UIkit.h>
#define NAVIITEM_INTERVAL 0.5
@interface UIControl (Extension)
//两次响应之间的时间间隔
@property (nonatomic, assign) NSTimeInterval uxy_acceptEventInterval;
//是否忽略事件true 忽略 flase不忽略
@property (nonatomic, strong) NSNumber *uxy_ignoreEvent;
@end
#import "UIControl+Extension.h"

@implementation UIControl (Extension)
static const char *UIControl_acceptEventInterval = "UIControl_acceptEventInterval";
static const char *uxy_ignoreEventKey = "uxy_ignoreEventKey";
- (NSTimeInterval)uxy_acceptEventInterval
{
    return [objc_getAssociatedObject(self, UIControl_acceptEventInterval) doubleValue];
}
- (void)setUxy_acceptEventInterval:(NSTimeInterval)uxy_acceptEventInterval
{
    objc_setAssociatedObject(self, UIControl_acceptEventInterval, @(uxy_acceptEventInterval), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(NSNumber *)uxy_ignoreEvent{
    return objc_getAssociatedObject(self, uxy_ignoreEventKey);
}
-(void)setUxy_ignoreEvent:(NSNumber *)uxy_ignoreEvent{
    objc_setAssociatedObject(self, uxy_ignoreEventKey, uxy_ignoreEvent, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
+ (void)load
{
    Method a = class_getInstanceMethod(self, @selector(sendAction:to:forEvent:));
    Method b = class_getInstanceMethod(self, @selector(__uxy_sendAction:to:forEvent:));
    method_exchangeImplementations(a, b);  
}
- (void)__uxy_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event
{
    if (self.uxy_ignoreEvent.boolValue) return;
    if (self.uxy_acceptEventInterval > 0)
    {
        self.uxy_ignoreEvent = @(YES);
        
        [self performSelector:@selector(setUxy_ignoreEvent:) withObject:@(NO) afterDelay:self.uxy_acceptEventInterval];
    }
    [self __uxy_sendAction:action to:target forEvent:event];
}
@end

在创建button的地方设置2次点击的间隔时间就可以了。如:

UIButton* btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.uxy_acceptEventInterval = NAVIITEM_INTERVAL;
上一篇下一篇

猜你喜欢

热点阅读