前言:
我们在开发工作中很有可能遇到需要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