目标

识别当前pan方向是指定方向

需要API

重写- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;

获取所在view上的滑动速率- (CGPoint)velocityInView:(nullable UIView *)view;

通过速率排序当前pan方向,获取方向

代码:

.h

////仿照SSWDirectionalPanGestureRecognizer,仅作为学习项目使用。

#import <UIKit/UIKit.h>

typedef NS_ENUM(NSInteger, HJPanDirection) {
    HJPanDirectionRight,
    HJPanDirectionDown,
    HJPanDirectionLeft,
    HJPanDirectionUp
};

@interface HJDirectionPanGestureRecognizer : UIPanGestureRecognizer

@property (nonatomic, assign) HJPanDirection direction;

@end

.m

#import "HJDirectionPanGestureRecognizer.h"
#import <UIKit/UIGestureRecognizerSubclass.h>

@interface HJDirectionPanGestureRecognizer ()
@property (nonatomic, assign) BOOL dragging;
@end

@implementation HJDirectionPanGestureRecognizer

- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [super touchesMoved:touches withEvent:event];

    if (self.state == UIGestureRecognizerStateFailed) {
        return;
    }

    CGPoint velocity = [self velocityInView:self.view];

    if (!self.dragging && !CGPointEqualToPoint(velocity, CGPointZero)) {

        NSDictionary * velocities = @{@(HJPanDirectionRight):@(velocity.x),
                                      @(HJPanDirectionDown) :@(velocity.y),
                                      @(HJPanDirectionLeft) :@(-velocity.x),
                                      @(HJPanDirectionUp)   :@(-velocity.y)};

        NSArray * keysSorted = [velocities keysSortedByValueUsingSelector:@selector(compare:)];

        if ([[keysSorted lastObject] integerValue] != self.direction) {
            self.state = UIGestureRecognizerStateFailed;
        }

        self.dragging = YES;
    }
}

////UIGestureRecognizerStateEnded after automatically called.
- (void)reset {
    [super reset];
    self.dragging = NO;//reset
}

@end

[Tip]重写PanGestureRecognizer的更多相关文章

  1. 已经重写,源码和文章请跳转http://www.cnblogs.com/ymnets/p/5621706.html

    文章由于写得比较仓促 已经重写,源码和文章请跳转 http://www.cnblogs.com/ymnets/p/5621706.html 系列目录 前言: 导入导出实在多例子,很多成熟的组建都分装了 ...

  2. Java程序性能优化Tip

    本博客是阅读<java time and space performance tips>这本小书后整理的读书笔记性质博客,增加了几个测试代码,代码可以在此下载:java时空间性能优化测试代 ...

  3. 自定义View(7)官方教程:自定义View(含onMeasure),自定义一个Layout(混合组件),重写一个现有组件

    Custom Components In this document The Basic Approach Fully Customized Components Compound Controls ...

  4. Entity Framework技巧系列之六 - Tip 20 – 25

    提示20. 怎样处理固定长度的主键 这是正在进行中的Entity Framework提示系列的第20篇. 固定长度字段填充: 如果你的数据库中有一个固定长度的列,例如像NCHAR(10)类型的列,当你 ...

  5. ntity Framework技巧系列之四 - Tip 13 – 15

    提示13. 附加一个实体的简单方式 问题: 在早先的一些提示中,我们讨论了使用Attach来加载一个处于未改变(unchanged)状态的东西到ObjectContext从而避免进行查询的开销. 如果 ...

  6. Url Rewrite 再说Url 重写

    前几天看到园子里一篇关于 Url 重写的文章<获取ISAPI_Rewrite重写后的URL>, URL-Rewrite 这项技术早已不是一项新技术了,这个话题也已经被很多人讨论过多次.搜索 ...

  7. Url Rewrite 重写

    前几天看到园子里一篇关于 Url 重写的文章<获取ISAPI_Rewrite重写后的URL>, URL-Rewrite 这项技术早已不是一项新技术了,这个话题也已经被很多人讨论过多次.搜索 ...

  8. Web Scalability for Startup Engineers Tip&Techniques for Scaling You Web Application --读书笔记

    Web Scalability for Startup Engineers Tip&Techniques for Scaling You Web Application 第1章和第2章讲述可伸 ...

  9. 自定义alert弹框,title不显示域名(重写alert)

    问题: 系统默认的alert弹框的title会默认显示网页域名 解决办法: (修改弹框样式) (function() { window.alert = function(name) { $(" ...

随机推荐

  1. RecyclerView如何消除底部的分割线

    最近遇到一个问题,用RecyclerView显示数据,纵向列表显示,添加默认分割线.   问题是:底部也会显示分割线,这很影响美观.   怎么解决这个问题呢?我想了很多办法,毫无头绪...   最后, ...

  2. RAC textView的双向绑定

    今天在写关于textView的数据绑定时原先写法是这样的: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #78 ...

  3. java日历显示年份、月份

    import java.util.Scanner;class CalendarMain{     //主函数入口    public static void main(String[] args)   ...

  4. Java类加载基本过程

    基本过程:   根据类的全限定名称加载定义类的二进制字节流. 将字节流代表的静态存储结构转化为方法区的运行时数据结构 内存中生成一个代表这个类的java.lang.Class对象,作为方法去这个类的各 ...

  5. SQL 中的 AND OR

    AND 和 OR 运算符用于基于一个以上的条件对记录进行过滤. AND 和 OR 运算符 AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来. 如果第一个条件和第二个条件都成立,则 ...

  6. plain framework 1 1.0.4 更新 稳定版发布

    PF由于各种因素迟迟不能更新,此次更新主要是更新了以往和上个版本出现的内存问题,该版本较为稳定,如果有用到的朋友请更新至此版本. PF 1.0.4 修复1.0.0.3更新后产生的内存问题,可能导致网络 ...

  7. eclipse启动优化,终于不那么卡了!

    eclipse启动优化,终于不那么卡了! 网上找了好多都是myEclipse的优化的,跟eclipse有点区别,找了很多方法还是不能让这个eclipse(Version: Kepler Release ...

  8. C++使用vector

    #include <iostream> #include <string> #include <vector> using namespace std; void ...

  9. linux查看cpu 命令

    总核数 = 物理CPU个数 * 每颗物理CPU的核数 总逻辑CPU数 = 物理CPU个数 * 每颗物理CPU的核数 * 超线程数 查看物理CPU个数 cat /proc/cpuinfo| grep & ...

  10. [LeetCode] Regular Expression Matching 正则表达式匹配

    Implement regular expression matching with support for '.' and '*'. '.' Matches any single character ...