IOS手势

[TOC]

## IOS****手势

学习ios手势,先要了解响应链,ios中只要继承UIResponse对象的都能成为事件的响应者,当用户操作手机屏幕时,所操作的控件就是第一响应者,操作事件一步步向下传递(如果该控件不做处理)

  • 事件响应链的传播路线:
 initial view –> super view –> …..–> view controller –> window –> Application –> AppDelegate
response响应链
  • UIResponse的触碰方法:
/**** 触摸事件方法,对触摸事件进行处理 *****/

- (void)touchesBegan:(NSSet *)touches withEvent:(nullableUIEvent*)event;//触摸开始

- (void)touchesMoved:(NSSet *)touches withEvent:(nullableUIEvent*)event;//触摸移动

- (void)touchesEnded:(NSSet *)touches withEvent:(nullableUIEvent*)event;//触摸结束

- (void)touchesCancelled:(nullableNSSet *)touches withEvent:(nullableUIEvent*)event;//触摸取消

                              

ios中主要的手势:

1.UITapGestureRecognizer //单击手势

�点击作为最常用手势,用于按下或选择一个控件或条目(类似于普通的鼠标点击)

/**
 添加点击手势
 */
- (void)addTapGestureWithTarget:(id)sender {
    
        //1,tap(点击)
        UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapGestureAction:)];
        //手势点击次数
        tapGesture.numberOfTapsRequired = 1;// Default is 1
        //点击手指数量
        tapGesture.numberOfTouchesRequired = 1;// Default is 1
        //将手势识别器添加到view上
        [sender addGestureRecognizer:tapGesture];

}
/**
 点击手势的响应方法
 */
-(void)tapGestureAction:(UITapGestureRecognizer*)gesture
{
    NSLog(@"%s",__FUNCTION__);
    UILabel *tempLabel = [self.view  viewWithTag:1001];
    NSInteger tapCount = gesture.numberOfTapsRequired;//点击次数
    NSInteger touchCount = gesture.numberOfTouchesRequired;//手指个数
    tempLabel.text = [NSString stringWithFormat:@"手指个数:%ld  点击次数:%ld",(long)touchCount,(long)tapCount];
    
}

2.UIPanGestureRecognizer //拖动手势

拖动用于实现一些页面的滚动,以及对控件的移动功能。

/**
 添加拖拽手势
 */
- (void)addPanGestureWithView:(id)sender {
    //2,pan(平移)
    UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panGestureAction:)];
    panGesture.minimumNumberOfTouches = 1;//最少点击次数---
    [sender addGestureRecognizer:panGesture];
}

/**
 拖拽手势相应方法
 */
-(void)panGestureAction:(UIPanGestureRecognizer*)gesture
{
    switch (gesture.state)
    {
            //开始
        case UIGestureRecognizerStateBegan:
        {
            NSLog(@"开始");
        }
            break;
            //改变
        case UIGestureRecognizerStateChanged:
        {
            //1,改变redView的frame
            UILabel *redView = (UILabel *)gesture.view;
            //2,改变的坐标-移动的距离
            CGPoint point = [gesture translationInView:redView];
            
            NSLog(@"%@",NSStringFromCGPoint(point));
            //3,根据移动的距离改变redView的frame
            //CGRectOffset - 根据偏移量改变view的x值和y值
            redView.frame = CGRectOffset(redView.frame, point.x, point.y);
            
            //清空偏移量的累加值
            [gesture setTranslation:CGPointZero inView:redView];
        }
            break;
            //结束
        case UIGestureRecognizerStateEnded:
        {
            NSLog(@"结束");
        }
            break;
            
        default:
            break;
    }
    NSLog(@"%s",__FUNCTION__);
    
}

3.UISwipeGestureRecognizer //轻扫手势

横扫手势用于激活列表项的快捷操作菜单

/**
 添加轻扫手势
 */
- (void)addSwipeGestureWithView:(UIView *)aView {
    //3,swipe(轻扫)
    UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeGestureAction:)];
    //8个方向
    //direction - 方向
    /*
     typedef NS_OPTIONS(NSUInteger, UISwipeGestureRecognizerDirection) {
     UISwipeGestureRecognizerDirectionRight = 1 << 0,
     UISwipeGestureRecognizerDirectionLeft  = 1 << 1,
     UISwipeGestureRecognizerDirectionUp    = 1 << 2,
     UISwipeGestureRecognizerDirectionDown  = 1 << 3
     };
     UISwipeGestureRecognizerDirectionLeft|UISwipeGestureRecognizerDirectionUp = 6
     UISwipeGestureRecognizerDirectionRight|UISwipeGestureRecognizerDirectionDown = 9
     UISwipeGestureRecognizerDirectionLeft|UISwipeGestureRecognizerDirectionDown = 10
     UISwipeGestureRecognizerDirectionRight|UISwipeGestureRecognizerDirectionUp = 5
     */
    swipeGesture.direction = UISwipeGestureRecognizerDirectionRight;

    [aView addGestureRecognizer:swipeGesture];
    
}
/**
 轻扫手势响应方法
 */
-(void)swipeGestureAction:(UISwipeGestureRecognizer*)gesture
{
    NSLog(@"%s",__FUNCTION__);
    int  direction = gesture.direction;
    UILabel * tempLabel = (UILabel *)gesture.view;
    if (direction == 1) {
        tempLabel.text = [NSString stringWithFormat:@"滑动方向:右"];
    }else if (direction == 2){
        tempLabel.text = [NSString stringWithFormat:@"滑动方向:左"];
    
    }else if (direction == 3){
        tempLabel.text = [NSString stringWithFormat:@"滑动方向:上"];
        
    }else if (direction == 4){
        tempLabel.text = [NSString stringWithFormat:@"滑动方向:下"];
        
    }
}

4.UIPinchGestureRecognizer //捏合手势

即放大缩小

/**
 添加捏合手势
 */
- (void)addPinchGestureWithView:(UIView *)aView {

    //4,pinch捏和
    UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(pinchGestureAction:)];
    [self.pinchImg addGestureRecognizer:pinchGesture];
    
}
/**
 捏合手势响应方法
 */
-(void)pinchGestureAction:(UIPinchGestureRecognizer*)gesture
{
    switch (gesture.state)
    {
        case UIGestureRecognizerStateBegan:
        {
            //手势开始
            //记录,当前view的frame,作为原始frame
            redViewRect = gesture.view.frame;
        }
            break;
        case UIGestureRecognizerStateChanged:
        {
            //1,拿到view
            UIView *redView = gesture.view;
            //2,改变view的frame
            
            //scale 缩放后的比例,跟1(原来的frame)
            CGFloat dx = CGRectGetWidth(redViewRect)*(1-gesture.scale); //宽度变化量
            CGFloat dy = CGRectGetHeight(redViewRect)*(1-gesture.scale);//高度变化量
            //dx dy 缩放的偏移量
    
            redView.frame = CGRectInset(redViewRect, dx, dy);
            
        }
            break;
        case UIGestureRecognizerStateEnded:
        {
            
        }
            break;
            
        default:
            break;
    }
    
    
}

5.UIScreenEdgePanGestureRecognizer//边缘滑入

滑动用于实现页面的快速滚动和翻页的功能。

/**
 添加边缘滑入手势
 */
- (void)addScreenEdgePanGestureWithView:(UIView *)aView {

    //5,ScreenEdgePan边缘划入
    UIScreenEdgePanGestureRecognizer *sePanGesture = [[UIScreenEdgePanGestureRecognizer alloc]initWithTarget:self action:@selector(seGestureAction:)];
    //划入的位置-(边缘的位置)
    /*
    typedef NS_OPTIONS(NSUInteger, UIRectEdge) {
        UIRectEdgeNone   = 0,
        UIRectEdgeTop    = 1 << 0,
        UIRectEdgeLeft   = 1 << 1,
        UIRectEdgeBottom = 1 << 2,
        UIRectEdgeRight  = 1 << 3,
        UIRectEdgeAll    = UIRectEdgeTop | UIRectEdgeLeft | UIRectEdgeBottom | UIRectEdgeRight
    }*/
    sePanGesture.edges = UIRectEdgeLeft;
    [aView addGestureRecognizer:sePanGesture];

}
/**
 边缘划入响应方法
 */
-(void)seGestureAction:(UIScreenEdgePanGestureRecognizer*)gesture
{
    NSLog(@"%s",__FUNCTION__);
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"边缘滑入" message:nil preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction *action = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDestructive handler:nil];
    [alert addAction:action];
    [self presentViewController:alert animated:YES completion:nil];
}

6.UIRotationGestureRecognizer //旋转手势

即将视图围绕中心点转动

/**
 添加旋转手势
 */
- (void)addRotationGestureWithView:(UIView *)aView {
    //6,rotation旋转
    UIRotationGestureRecognizer *rotationGesture = [[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(rotationGestureAction:)];
    [aView addGestureRecognizer:rotationGesture];
}
/**
 旋转手势响应方法
 */
-(void)rotationGestureAction:(UIRotationGestureRecognizer*)gesture
{
    CGFloat  rotation = gesture.rotation;//旋转的弧度
    CGFloat velocity = gesture.velocity;//旋转速度 (radians/second)
    gesture.view.transform = CGAffineTransformMakeRotation(rotation);
    UILabel *tempLabel = (UILabel *)gesture.view;
    tempLabel.text = [NSString stringWithFormat:@"旋转弧度:%f \n 旋转速度:%f",rotation,velocity];
    

}

7.UILongPressGestureRecognizer //长按手势

将出现编辑菜单

/**
 添加长按手势
 */
- (void)addLongPressGestureWithView:(UIView *)aView {

    //7,longPress长按
    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPressAction:)];
    /* numberOfTouchesRequired这个属性保存了有多少个手指点击了屏幕,因此你要确保你每次的点击手指数目是一样的,默认值是为 0. */
    longPress.numberOfTouchesRequired = 1;//手指个数
    //longPress.minimumPressDuration = 2;//按的最少时长
    /*最大100像素的运动是手势识别所允许的  Default is 10.*/
    longPress.allowableMovement = 100; //
    /*这个参数表示,两次点击之间间隔的时间长度。Default is 0.5.*/
    longPress.minimumPressDuration = 1.0;
    [aView addGestureRecognizer:longPress];

}
/**
 长按相应方法
 */
-(void)longPressAction:(UILongPressGestureRecognizer *)gesture
{
    NSLog(@"%s",__FUNCTION__);
    //弹出menu
    switch (gesture.state) {
        case UIGestureRecognizerStateBegan:
        {
            //UIMenuController menu控制器
            //系统的粘贴复制的小弹框
            //menuController  单例
            UIMenuController *ctr = [UIMenuController sharedMenuController];
           /*自定义Menu按钮
            //menu按钮
            UIMenuItem *mItem = [[UIMenuItem alloc]initWithTitle:@"自定义" action:@selector(longPressMenuAction)];
            
            UIMenuItem *mItem1 = [[UIMenuItem alloc]initWithTitle:@"复制" action:@selector(longPressMenuAction)];
            UIMenuItem *mItem2 = [[UIMenuItem alloc]initWithTitle:@"粘贴" action:@selector(longPressMenuAction)];
            
            //将item添加到controller中
            ctr.menuItems = [NSArray  arrayWithObjects:mItem,mItem1,mItem2,nil];//@[mItem,mItem1,mItem2];
            */
            
            //获得手指点击的位置
            CGPoint point = [gesture locationInView:gesture.view];
            //设置显示的位置
            [ctr setTargetRect:CGRectMake(point.x, point.y, 0, 0) inView:gesture.view];
            //显示menu工具条
            [ctr setMenuVisible:YES animated:YES];
            
        }
            break;
        default:
            break;
    }
}

##****参考文档:

浅谈iOS手势

ios事件处理

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 7,273评论 4 39
  • 手势识别器是附加到视图的对象,将低级别事件处理代码转换为更高级别的操作,它允许视图以控件执行的方式响应操作。 手势...
    坤坤同学阅读 2,469评论 0 9
  • 2017年11月25日 第一是去书店,偶遇书籍 第二是读报纸阅读,自己不会刻意关注的事情 第三是写短文,一定注意引...
    温伯凉_读书笔记阅读 105评论 0 0
  • 笔者来自小城市,在我进入魔都之前,遇到的姑娘都是很美好的。她们要不就是脾气好,要不就是声音甜。她们平日里可能出门从...
    CaptainKyo阅读 1,012评论 0 5
  • 雷军做手机先市调 雷军在做手机之前是做过详细市调分析的,发现苹果手机是全球做手机第一,而且就只有几款产品,保持每年...
    育儿师徐珊珊阅读 887评论 0 3