封装-给继承自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添加之后的效果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值