1. 程式人生 > >封裝-給繼承自UIView的控制元件新增點選事件

封裝-給繼承自UIView的控制元件新增點選事件

在實際開發中,可能會需要給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裡的測試效果
這是一個View和一個label新增之後的效果