美文网首页iOS 常规
监听手势滑动距离

监听手势滑动距离

作者: 乐视薯片 | 来源:发表于2019-12-04 18:59 被阅读0次

这几天一直在纠结怎么监听滑动手势,获得滑动的距离,但是就是没有一篇文章解决我的问题,自己摸索了好久,才知道怎么搞,这么有纪念意义,一定要记录一下。

我写的SDK,需要监听用户滑动屏幕的距离,如果重写touchesBegan这一类方法,有两大缺点:一、如果客户的app里有重写这些方法,则会冲突;二、如果用户手势点击到了响应优先级高的地方(比如按钮),则不会执行这些方法,达不到我们想要的效果。因此,只能拦截系统方法sendEvent了,也就是苹果所谓的黑魔法。

那么这样,又怎么获得滑动的长度呢?

拦截方法就可以获得UIEvent对象,从而得到触摸事件UItouch对象,UITouch对象有个phase属性,这个属性有四个取值:UITouchPhaseBegan、UITouchPhaseMoved、UITouchPhaseStationary、UITouchPhaseEnded、UITouchPhaseCancelled。其中的began、moved、ended就可以实现我们想要的结果了。

拦截到系统的sendEvent,先执行我们的事件处理方法,然后执行系统的方法,还是上代码吧!!!

staticfloatswipeLength =0;

staticCGPointprePoint;

@implementationWindowHook

+ (instancetype)sharedWindowHook

{

    staticWindowHook*windowHook =nil;

    staticdispatch_once_tpredicate;

    dispatch_once(&predicate, ^{

    windowHook = [[selfalloc]init];

});

returnwindowHook;

}

+ (void)initialize

{

     Method sendEvent=class_getInstanceMethod([UIWindowclass],@selector(sendEvent:));

     Method sendEventMySelf=class_getInstanceMethod([selfclass],@selector(sendEventHooked:));

     IMPsendEventImp =method_getImplementation(sendEvent);

     class_addMethod([UIWindowclass],@selector(sendEventOriginal:), sendEventImp,method_getTypeEncoding(sendEvent));

     IMPsendEventMySelfImp =method_getImplementation(sendEventMySelf);

     class_replaceMethod([UIWindowclass],@selector(sendEvent:), sendEventMySelfImp,method_getTypeEncoding(sendEvent));

}

对事件怎么处理呢,看下面:

- (void)sendEventHooked:(UIEvent*)event

{

      [selfperformSelector:@selector(sendEventOriginal:)withObject:event];

      NSSet*touches = [eventallTouches];

      UITouch*touch = [touchesanyObject];

      UITouchPhasephase = touch.phase;

      UIWindow*keyWindow = [[UIApplicationsharedApplication]keyWindow];

      CGPointcurrentPoint = [touchlocationInView:keyWindow];

      NSLog(@"(%f,%f)",currentPoint.x,currentPoint.y);

      switch(phase) {

          caseUITouchPhaseBegan:

          {

               prePoint= currentPoint;

          }

          break;

          caseUITouchPhaseMoved:

          {

               floatdistance =fabs(currentPoint.y-prePoint.y);

               swipeLength=swipeLength+distance;

               prePoint= currentPoint;

          }

          break;

          caseUITouchPhaseEnded:

          {

                NSLog(@"%f",swipeLength);

                swipeLength=0;

          }

           break;

          default:

           break;

     }

}

我理解的还是比较浅显,有错的地方,还请大家指出来啊!!!

相关文章

  • React中如何实现手势滑动, 切换轮播图图片

    手势滑动, 使用onTouch事件系列只需要监听手势滑动的x轴距离即可(如果是竖播轮播图, 就监听y轴距离) 逻辑...

  • 03-手势滑动

    1、监听手势滑动的方法 1-1、监听手势开始接触屏幕方法 1-2、监听手势在屏幕上滑动方法 1-3、监听手势滑动结...

  • 监听手势滑动距离

    这几天一直在纠结怎么监听滑动手势,获得滑动的距离,但是就是没有一篇文章解决我的问题,自己摸索了好久,才知道怎么搞,...

  • 监听手势滑动距离

    这几天一直在纠结怎么监听滑动手势,获得滑动的距离,但是就是没有一篇文章解决我的问题,自己摸索了好久,才知道怎么搞,...

  • Android自定义支持滑动监听View

    前言 平时Android开发,关于手势的监听很常用,比如滑动监听,手势缩放(最常见的可缩放ImageView),那...

  • 微信小程序 滑动删除列表项

    效果图 思路 每个列表项绑定touchstart和touchmove事件,监听滑动手势,确定滑动角度,判断滑动是否...

  • flutter 滚动小部件原理

    由上图可知,滚动的实现为: 监听手势,并将滑动手势转换为offset 重新layout,并将offset传递下去,...

  • iOS监听控制器滑动返回的方法

    当我们用手势滑动返回是需要监听他的返回事件,在UIViewController (UIContainerViewC...

  • RecyclerView监听滑动距离

    需求:RecyclerView中实现往上滑动背景颜色或者图片变淡直至白色或者透明,往下滑背景颜色或者图片从白色逐渐...

  • Android 图片双击缩放&拖动查看

    一.实现的效果 二.思路 1.定义放大和缩小的系数2.监听双击3.监听手势滑动&fling 三.难点及解决 3.1...

网友评论

    本文标题:监听手势滑动距离

    本文链接:https://www.haomeiwen.com/subject/ggglgctx.html