Swift.用RunTime和Extension的方式为UIView添加手势方法

本文介绍了如何通过Swift的Runtime和Extension来为UIView及其子类添加点击、双击、长按和滑动手势,提高代码复用性和可读性。详细步骤包括定义手势协议、设置Runtime属性Key、创建手势类以及扩展UIView。提供了实现效果和使用方法,便于开发者快速集成。
摘要由CSDN通过智能技术生成

效果图

前言:

我们在开发工作中很有可能遇到需要view相应各种手势的需求,使用RunTime+Extension的形式为UIView进行拓展,代码的复用性,可读性都很高.

实现效果:

为UIView及其子类添加了点击,双击,长按,上滑,左滑,右滑,下滑手势方法,调用方法简单轻便.

实现方式:

1.添加滑动手势协议.

2.设置RunTime添加属性时的Key.

3.创建点击,长按,滑动手势类.

4.使用Extension为UIView进行拓展.


1.添加滑动手势协议.

在协议中添加滑动事件以及相应触发方法.

 ///添加点击事件协议
protocol UIViewTapable {
    ///单击事件
    var tapHandlers: [CRTapGestureHanler] { get }
    ///双击事件
    var doubleTapGestureHandlers: [CRTapGestureHanler]{ get }
    ///长点事件
    var longTapGestureHandlers: [CRTapGestureHanler]{ get }
    ///上滑事件
    var upSwipeGestureHandlers: [CRTapGestureHanler]{ get }
    ///左滑事件
    var leftSwipeGestureHandlers: [CRTapGestureHanler]{ get }
    ///右滑事件
    var rightSwipeGestureHandlers: [CRTapGestureHanler]{ get }
    ///下滑事件
    var downSwipeGestureHandlers: [CRTapGestureHanler]{ get }

    func whenTapped(handler:@escaping()->Void)
    func whenDoubleTapped(handler:@escaping()->Void)
    func whenLongPressed(handler:@escaping()->Void)
    func whenUpSwiped(handler:@escaping()->Void)
    func whenLeftSwiped(handler:@escaping()->Void)
    func whenRightSwiped(handler:@escaping()->Void)
    func whenDownSwiped(handler:@escaping()->Void)

}

2.设置RunTime添加属性时的Key.

在这里我们设置所有手势相应的String标识以及与之对应的内存地址Key.

///runtime绑定方法时的key
class EWGestureAssociatedObjectKey {
    ///设置不同手势不同String标识
    static let EWTapGestureAssociatedObjectString  = "EWTapGestureAssociatedObjectString"
    ///获取String标识的内存地址作为runtime属性的Key
    static var EWTapGestureKey = {return Unmanaged<AnyObject>.passUnretained(EWGestureAssociatedObjectKey.EWTapGestureAssociatedObjectString as AnyObject).toOpaque()}()

    static let EWDoubleTapGestureAssociatedObjectString  = "EWDoubleTapGestureAssociatedObjectString"
    static var EWDoubleTapGestureKey = {return Unmanaged<AnyObject>.passUnretained(EWGestureAssociatedObjectKey.EWDoubleTapGestureAssociatedObjectString as AnyObject).toOpaque()}()

    static let EWLongTapGestureAssociatedObjectString  = "EWLongTapGestureAssociatedObjectString"
    static var EWLongTapGestureKey = {return Unmanaged<AnyObject>.passUnretained(EWGestureAssociatedObjectKey.EWLongTapGestureAssociatedObjectString as AnyObject).toOpaque()}()

    static let EWUpSwipeGestureAssociatedObjectString  = "EWUpSwipeGestureAssociatedObjectString"
    static var EWUpSwipeGestureKey
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值