封裝-給繼承自UIView的控制元件新增點選事件
阿新 • • 發佈:2019-01-09
在實際開發中,可能會需要給UILabel、UIView等等新增點選事件,目的就是在保留控制元件自身屬性的同時,多一個點選效果,所以這裡寫了一個UIView的category,用於處理這種情況。
1、.h檔案程式碼如下:
#import <UIKit/UIKit.h>
typedef void (^WhenTappedBlock)();
@interface UIView (Tapped) <UIGestureRecognizerDelegate>
/*!
@method
@abstract 單擊
@param block 程式碼塊
*/
- (void)whenTapped:(WhenTappedBlock)block;
@end
這裡聲明瞭一個block,用於在新增點選事件時,直接在block回撥裡面處理點選的響應事件。
2、.m檔案主要程式碼如下:
#import "UIView+Tapped.h"
#import <objc/runtime.h>
@implementation UIView (Tapped)
static char kWhenTappedBlockKey;
#pragma mark - Set blocks
- (void)setBlock:(WhenTappedBlock)block forKey:(void *)blockKey {
self.userInteractionEnabled = YES;
objc_setAssociatedObject(self, blockKey, block, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (void)runBlockForKey:(void *)blockKey {
WhenTappedBlock block = objc_getAssociatedObject(self, blockKey);
if (block) block();
}
#pragma mark - When Tapped
- (void)whenTapped:(WhenTappedBlock)block {
//新增點選手勢
UITapGestureRecognizer* gesture = [self addTapGestureRecognizerWithTaps:1 touches:1 selector:@selector(viewWasTapped)];
[self addGestureRecognizer:gesture];
[self setBlock:block forKey:&kWhenTappedBlockKey];
}
/*手勢點選響應事件*/
- (void)viewWasTapped {
[self runBlockForKey:&kWhenTappedBlockKey];
}
#pragma mark - addTapGesture
- (UITapGestureRecognizer*)addTapGestureRecognizerWithTaps:(NSUInteger)taps touches:(NSUInteger)touches selector:(SEL)selector {
UITapGestureRecognizer* tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:selector];
tapGesture.delegate = self;
tapGesture.numberOfTapsRequired = taps;
tapGesture.numberOfTouchesRequired = touches;
return tapGesture;
}
@end
這裡用到了一個runtime的方法處理block。當然也可以不必像上面那樣,可以通過delegate實現。這裡只是一個思路,記錄一下。
呼叫的時候也是非常方便,在要實現的地方新增#import “UIView+Tapped.h”,然後在初始化控制元件的地方新增如下程式碼即可:
[label whenTapped:^{
//這裡新增點選響應的方法
}];
下面是demo裡的測試效果