iOS UIView一行代码添加手势

平常我们给UIView添加手势都要 addGestureRecognizer, 然后实现 action方法, 代码比较分散, 现在我们可以制作一个UIView分类, 利用block只要一行代码即可实现.

ps: 分类里面利用runtime的属性关联, 来完成属性的使用.


如何使用

导入#import “UIView+Tap.h”

 [self.view nyl_addTapGes:^{
        NSLog(@"点击");
 }];
 2019-08-23 23:25:18.913797+0800 RACDemo[1893:64894] 点击

具体代码实现

创建UIView (Tap)

UIView+Tap.h

#import <UIKit/UIKit.h>

typedef void (^TapBlock)(void);

NS_ASSUME_NONNULL_BEGIN

@interface UIView (Tap)

@property (nonatomic, copy) TapBlock tapBlock;

- (void)nyl_addTapGes:(TapBlock)block;

@end

NS_ASSUME_NONNULL_END

UIView+Tap.m

//
//  UIView+Tap.m
//  RACDemo
//
//  Created by 聂银龙 on 2019/8/23.
//  Copyright © 2019 聂银龙. All rights reserved.
//

#import "UIView+Tap.h"
#import <objc/runtime.h>

const char *blockKey = "blockKey";

@implementation UIView (Tap)


- (void)setTapBlock:(TapBlock)tapBlock {
    objc_setAssociatedObject(self, &blockKey, tapBlock, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (TapBlock)tapBlock {
    return objc_getAssociatedObject(self, &blockKey);
}

- (void)nyl_addTapGes:(TapBlock)block {
    self.tapBlock = block; // 把block赋值给self.tapBlock, 可以在当前函数之外执行该回调
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGes)];
    [self addGestureRecognizer:tap];
}

- (void)tapGes {
    if (self.tapBlock) {
        self.tapBlock(); // 执行回调
    }
}

@end

UIButton添加按钮同上原理

创建一个UIButton分类, 只需在block回调函数替换为

[self addTarget:self action:@selector(actionBtnClick) forControlEvents:(UIControlEventTouchUpInside)];

具体代码如下

#import "UIButton+Action.h"
#import <objc/runtime.h>

const char *blockKey = "blockKey";

@implementation UIButton (Action)

- (void)setTapBlock:(TapBlock)tapBlock {
    objc_setAssociatedObject(self, &blockKey, tapBlock, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (TapBlock)tapBlock {
    return objc_getAssociatedObject(self, &blockKey);
}

- (void)nyl_addAction:(TapBlock)block {
    self.tapBlock = block;
    [self addTarget:self action:@selector(actionBtnClick) forControlEvents:(UIControlEventTouchUpInside)];
}

- (void)actionBtnClick {
    if (self.tapBlock) {
        self.tapBlock();
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值