zoukankan      html  css  js  c++  java
  • 关于ios的手势识别(GestureRecognizers)讲解

    大家都知道,苹果的设备,不管是mac机器还是iPhone或iad,都支持多点触控,进而延伸了多种手势识别的功能。这为用户带来了很大的便携性和多样灵活性,极大的方便了用户的使用。足以见手势识别(GestureRecognizers)在开发中也有举足轻重的作用。

    在iOS 4以前,手势识别由开发人员负责。

       主要使用的是由UIResponder而来的如下4种方式:

     - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
     - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
     - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
     - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

    这往往需要进行复杂的数学运算才能甄别不用的手势,苹果意识到这种情况的复杂性和手势对iPhone用户界面的重要性之后,在iOS4中加入了UIGestureRecognizer类,使开发者更容易实现各种手势的识别。

    UIGestureRecognizer类是继承自Nsobject的抽象类,它派生的6个主要子类分别诠释了不同的手势识别。

    • UITapGestureRecognizer – “轻击”手势。可以配置为“单击”和“连击”的识别。
    • UIPinchGestureRecognizer –“捏合”手势。该手势通常用于缩放视图或改变可视组件的大小。
    • UIPanGestureRecognizer – “平移”手势。识别拖拽或移动动作。
    • UISwipeGestureRecognizer – “轻扫”手势。当用户从屏幕上划过时识别为该手势。可以指定该动作的方向(上、下、左、右)。
    • UIRotationGestureRecognizer – “转动”手势。用户两指在屏幕上做相对环形运动。
    • UILongPressGestureRecognizer – “长按”手势。使用1指或多指触摸屏幕并保持一定时间。

    这些手势识别器必需和视图通过addGestureRecognizer:方法联系在一起。识别器必需指定一个响应方法以便发生指定手势时进行调用。removeGestureRecognizer:方法可以将识别器从视图中移出,方法参数指定要移除的识别器.

    识别器响应消息

     iOS 4 的手势识别器在侦测到某个手势发生时,使用目标-动作模型去通知应用程序。当一个识别器被创建之后,只要有对应的手势发生,就会调用创建时指定的方法。

    连续和不连续手势

     手势分为“连续手势”和“不连续手势”两种。“不连续手势”只会导致调用响应方法一次。“轻击”(包括多击)仅仅会触发一次响应方法。而“轻扫”、“平移”、“旋转”、“捏合”则是连续手势,它们会连续不断地调用响应方法直到手势结束。

    从手势中获取数据

    每个手势响应方法都会被传入一个UIGestureRecognizer* sender对象,从中可以获取到和手势有关的信息。例如,对于“捏合”手势,可以通过这个参数获取缩放系数、捏合速度。对于“转动”手势,则可以获得转动的次数及速度。

    识别轻击手势

     轻击手势使用UITapGestureRecognizer类进行识别。在alloc和init时必需指定一个手势触发时调用的方法引用(即selector选择器)。使用numberOfTapsRequired属性可以定义轻击必需被连续操作的次数。如以下代码所示,当识别器侦测到连续轻击2次时,将触发tapDetected:方法。

    -(void) tapGestureRecognizeTest

    {

        UITapGestureRecognizer *doubleTap=[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapDeteted:)];

        doubleTap.numberOfTapsRequired=2;

        [self.parentUiView addGestureRecognizer:doubleTap];

        [doubleTap release];

    }

    -(IBAction)tapDeteted:(UIGestureRecognizer *)sender

    {

        NSLog(@"双击手势");

    }

    识别捏合手势

     捏合手势使用UIPinchGestureRecognizer类识别。例如:

    -(void) pinchGestureRecongnizeTest

    {

        UIPinchGestureRecognizer *pinshGesture=[[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinshDeteted:)];

        

        [self.parentUiView addGestureRecognizer:pinshGesture];

        [pinshGesture release];

    }

    -(IBAction)pinshDeteted:(UIGestureRecognizer *)sender

    {

        NSLog(@"此触摸手势为%@",@"捏合手势");

    }

    识别转动手势

    转动手势使用UIRotationGestureRecognizer类。

    UIRotationGestureRecognizer *rotationRecognizer =
          [[UIRotationGestureRecognizer alloc]
          initWithTarget:self
           action:@selector(rotationDetected:)]; 
    [self.view addGestureRecognizer:rotationRecognizer]; 
    [rotationRecognizer release]; 
     

    识别平移手势

    平移手势使用UIPanGestureRecognizer 类。平移手势是最基本的连续手势。例如手指在屏幕上随意乱划可以被识别为平移或拖拽操作:

    UIRotationGestureRecognizer *panRecognizer =
           [[UIPanGestureRecognizer alloc]
          initWithTarget:self
           action:@selector(panDetected:)]; 
    [self.view addGestureRecognizer:panRecognizer]; 
    [panRecognizer release]; 

    如果轻扫和平移都添加在同一个view中,那么很可能大部分轻扫手势都会被识别为平移。而且如果两种手势被添加到同一个view时,会产生一个警告。

    识别轻扫手势

    轻扫手势使用 UISwipeGestureRecognizer 类。所有的轻扫都将被识别,或者你可以指定只侦测方向为以下常量的轻扫:

    • UISwipeGestureRecognizerDirectionRight
    • UISwipeGestureRecognizerDirectionLeft
    • UISwipeGestureRecognizerDirectionUp
    • USwipeIGestureRecognizerDirectionDown

    如果不指定direction属性,默认只侦测方向为右的轻扫。以下代码设置只侦测向上轻扫:

    UISwipeGestureRecognizer *swipeRecognizer =
            [[UISwipeGestureRecognizer alloc]
           initWithTarget:self
            action:@selector(swipeDetected:)]; 
    swipeRecognizer.direction = UISwipeGestureRecognizerDirectionUp; [self.view addGestureRecognizer:swipeRecognizer]; 
    [swipeRecognizer release]; 
     

    识别长按手势

    长按手势使用 UILongPressGestureRecognizer 类。这个手势需要指定长按的时间,触摸的次数,点击的次数以及在触摸过程中是否允许移动。这些选项分别由minimumPressDuration, numberOfTouchesRequired, numberOfTapsRequired 和allowableMovement 属性指定。以下代码使识别器只侦测单指长按3秒以上的手势。allowableMovement未指定,默认是允许10个像素的移动:

    UILongPressGestureRecognizer *longPressRecognizer =
           [[UILongPressGestureRecognizer alloc]
          initWithTarget:self
           action:@selector(longPressDetected:)]; longPressRecognizer.minimumPressDuration = 3; 
    longPressRecognizer.numberOfTouchesRequired = 1; 
    [self.view addGestureRecognizer:longPressRecognizer];
    [longPressRecognizer release]; 

     注:ios模拟器使用捏合手势时,按住option键。然后结合鼠标模拟。 触摸手势说明: (1)右键按住+移动鼠标向左=放大; (2)右键按住+移动鼠标向右=缩小; (3)右键按住+移动鼠标向上=前倾; (4)右键按住+移动鼠标向下=后倾

  • 相关阅读:
    Solr3.5安装测试指南yzn
    Babylon.js 构建 地球,支持切片地图 (四)
    arcgis 4 与deckgl 整合 (一)
    初遇Citymaker (一)
    arcgis 4 与deckgl 整合 (三)
    Babylon.js 构建 地球,支持切片地图 (一)
    Babylon.js 构建 地球,支持切片地图 (五)
    Babylon.js 构建 地球,支持切片地图 (三)
    Babylon.js 构建 地球,支持切片地图 (六)
    Babylon.js 构建 地球,支持切片地图 (二)
  • 原文地址:https://www.cnblogs.com/hj2xx2hj/p/4895378.html
Copyright © 2011-2022 走看看