手势知多少

UIGestureRecognizer 是一个具体手势的基类,提供了较为简单的手势实现方式

The concrete subclasses of UIGestureRecognizer are the following:

一个gesture recognizer是针对一个特定的view的(包含其subview),用UIView的方法addGestureRecognize:去关联一个view

一个gesture recognizer是不参与UIView的事件响应链的

各个手势使用时的代码:

UITapGestureRecognizer

[cpp] view plaincopy

  1. - (void)viewDidLoad
  2. {
  3. [super viewDidLoad];
  4. // Do any additional setup after loading the view from its nib.
  5. UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
  6. if (![tapGesture respondsToSelector:@selector(locationInView:)]) {
  7. [tapGesture release];
  8. tapGesture = nil;
  9. }else {
  10. tapGesture.delegate = self;
  11. tapGesture.numberOfTapsRequired = 1; // The default value is 1.
  12. tapGesture.numberOfTouchesRequired = 1; // The default value is 1.
  13. [self.view addGestureRecognizer:tapGesture];
  14. }
  15. }

[cpp] view plaincopy

  1. - (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer
  2. {
  3. UIView *view = [gestureRecognizer view]; // 这个view是手势所属的view,也就是增加手势的那个view
  4. switch (gestureRecognizer.state) {
  5. case UIGestureRecognizerStateEnded:{ // UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded // 正常情况下只响应这个消息
  6. NSLog(@"======UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized");
  7. break;
  8. }
  9. case UIGestureRecognizerStateFailed:{ //
  10. NSLog(@"======UIGestureRecognizerStateFailed");
  11. break;
  12. }
  13. case UIGestureRecognizerStatePossible:{ //
  14. NSLog(@"======UIGestureRecognizerStatePossible");
  15. break;
  16. }
  17. default:{
  18. NSLog(@"======Unknow gestureRecognizer");
  19. break;
  20. }
  21. }
  22. }
  23. // 询问一个手势接收者是否应该开始解释执行一个触摸接收事件
  24. - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
  25. //    CGPoint currentPoint = [gestureRecognizer locationInView:self.view];
  26. //    if (CGRectContainsPoint(CGRectMake(0, 0, 100, 100), currentPoint) ) {
  27. //        return YES;
  28. //    }
  29. //
  30. //    return NO;
  31. return YES;
  32. }
  33. // 询问delegate,两个手势是否同时接收消息,返回YES同事接收。返回NO,不同是接收(如果另外一个手势返回YES,则并不能保证不同时接收消息)the default implementation returns NO。
  34. // 这个函数一般在一个手势接收者要阻止另外一个手势接收自己的消息的时候调用
  35. - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
  36. return NO;
  37. }
  38. // 询问delegate是否允许手势接收者接收一个touch对象
  39. // 返回YES,则允许对这个touch对象审核,NO,则不允许。
  40. // 这个方法在touchesBegan:withEvent:之前调用,为一个新的touch对象进行调用
  41. - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
  42. return YES;
  43. }

UIPinchGestureRecognizer

[cpp] view plaincopy

  1. - (void)viewDidLoad
  2. {
  3. [super viewDidLoad];
  4. // Do any additional setup after loading the view from its nib.
  5. UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
  6. if (![pinchGesture respondsToSelector:@selector(locationInView:)]) {
  7. [pinchGesture release];
  8. pinchGesture = nil;
  9. }else {
  10. pinchGesture.delegate = self;
  11. [self.view addGestureRecognizer: pinchGesture];
  12. }
  13. }
  14. - (void)handleGesture:(UIPinchGestureRecognizer *)gestureRecognizer
  15. {
  16. UIView *view = [gestureRecognizer view]; // 这个view是手势所属的view,也就是增加手势的那个view
  17. /*
  18. scale属性: 可以理解为两手指之间的距离,其实是个比例,相对距离,不是绝对距离
  19. 以刚开始的两个手指对应的两个point的之间的距离为标准,此时scale=1.
  20. 若两手指之间距离减小,则scale不断变小,当两指重合,则变为0
  21. 若两手指之间距离变大,则scale不断增大,没有上限,看屏幕多大
  22. velocity属性: 可以理解为两手指之间的移动速度,其实是个速度比例,相对速度,不是绝对速度
  23. 以刚开始的两个手指对应的两个point的之间的距离为标准,此时velocity=0.
  24. 若两手指之间距离减小,则velocity为负数,从-0开始,随着手指向里捏合的速度越快,负值越大,没有上限,我测试了下,可以到-20.009099,甚至更大
  25. 若两手指之间距离变大,则velocity不断正数,没有上限,从0开始,随着手指向外捏合的速度越快,值越大,没有上限,我测试了下,可以到170.234663,甚至更大
  26. 注意:在这个过程中,出现了nan值。
  27. 有关NAN值的介绍如下:(http://www.cnblogs.com/konlil/archive/2011/07/06/2099646.html)
  28. 浮点异常值:NAN,QNAN,SNAN
  29. 32位浮点数在机器中的表示按照IEEE的标准是这样的:
  30. +------+----------------+-------------------------------+
  31. | 1bit    |   8bit               |         23bit                            |
  32. +------+----------------+-------------------------------+
  33. 其中:1bit表示符号位(0表示正,1表示负),8bit表示指数(0~255,实际指数取值还要减去127,即指数取值区间为-127~128),23bit表示尾数。
  34. 这里所要说的浮点异常值就是这种表示产生的几种特殊值,IEEE规定根据指数和尾数的不同分别可表示如下几种特殊值:
  35. 1. 零值:按上述的浮点表述形式如果指数部分全部为0,并且尾数全部为0,则表示为浮点0.0,并且规定-0 = +0
  36. 2. 非规格化值:如果指数全部为0,尾数非0,则表示非规格化的值,16进制看到的就是[80xxxxxx]h或者[00xxxxxx]h
  37. 3. 无穷值:如果指数全部为1,尾数全部为0,则根据符号位分别表示正无穷大和负无穷大,16进制看到的就是[FF800000]h或者[7F800000]h
  38. 4. NAN:主角来了,如果指数全部为1,尾数非0,则表示这个值不是一个真正的值(Not A Number)。NAN又分成两类:QNAN(Quiet NAN)和SNAN(Singaling NAN)。QNAN与SNAN的不同之处在于,QNAN的尾数部分最高位定义为1,SNAN最高位定义为0;QNAN一般表示未定义的算术运算结果,最常见的莫过于除0运算;SNAN一般被用于标记未初始化的值,以此来捕获异常。
  39. 那么既然NAN不是一个真实的数值,在程序如何判断变量是否变成了NAN呢?大部分语言中针对NAN值都有一系列的函数定义,C语言中最常见的三个函数:
  40. _isnan(double x);                  //判断是否为NAN
  41. _finite(double x);                  //判读是否为无穷大
  42. _fpclass(double x);                //返回一系列的定义值,如:_FPCLASS_QNAN, _FPCLASS_SNAN,具体参考MSDN
  43. */
  44. CGFloat scale = gestureRecognizer.scale;
  45. NSLog(@"======scale: %f", scale);
  46. CGFloat velocity = gestureRecognizer.velocity;
  47. NSLog(@"======scvelocityale: %f", velocity);
  48. /*
  49. 捏合手势
  50. 这个一般情况下只响应
  51. UIGestureRecognizerStateBegan、
  52. UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized、
  53. UIGestureRecognizerStateChanged消息,
  54. 一个UIGestureRecognizerStateBegan,接下去是N多的UIGestureRecognizerStateChanged,scale的值此时会不断的变化,当手指离开时,响应UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized
  55. */
  56. switch (gestureRecognizer.state) {
  57. case UIGestureRecognizerStateEnded:{ // UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded
  58. NSLog(@"======UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized");
  59. break;
  60. }
  61. case UIGestureRecognizerStateBegan:{ //
  62. NSLog(@"======UIGestureRecognizerStateBegan");
  63. break;
  64. }
  65. case UIGestureRecognizerStateChanged:{ //
  66. NSLog(@"======UIGestureRecognizerStateChanged");
  67. gestureRecognizer.view.transform = CGAffineTransformScale(gestureRecognizer.view.transform, gestureRecognizer.scale, gestureRecognizer.scale);
  68. gestureRecognizer.scale = 1; // 重置,很重要!!!
  69. break;
  70. }
  71. case UIGestureRecognizerStateCancelled:{ //
  72. NSLog(@"======UIGestureRecognizerStateCancelled");
  73. break;
  74. }
  75. case UIGestureRecognizerStateFailed:{ //
  76. NSLog(@"======UIGestureRecognizerStateFailed");
  77. break;
  78. }
  79. case UIGestureRecognizerStatePossible:{ //
  80. NSLog(@"======UIGestureRecognizerStatePossible");
  81. break;
  82. }
  83. default:{
  84. NSLog(@"======Unknow gestureRecognizer");
  85. break;
  86. }
  87. }
  88. }

UIRotationGestureRecognizer

[cpp] view plaincopy

  1. - (void)viewDidLoad
  2. {
  3. [super viewDidLoad];
  4. // Do any additional setup after loading the view from its nib.
  5. UIRotationGestureRecognizer *rotationGesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
  6. if (![rotationGesture respondsToSelector:@selector(locationInView:)]) {
  7. [rotationGesture release];
  8. rotationGesture = nil;
  9. }else {
  10. rotationGesture.delegate = self;
  11. [self.view addGestureRecognizer:rotationGesture];
  12. }
  13. }
  14. - (void)handleGesture:(UIRotationGestureRecognizer *)gestureRecognizer
  15. {
  16. UIView *view = [gestureRecognizer view]; // 这个view是手势所属的view,也就是增加手势的那个view
  17. /*
  18. rotation属性: 可以理解为两手指之间的旋转的角度,其实是个比例,相对角度,不是绝对角度
  19. 以刚开始的两个手指对应的两个point的之间的那条直线为标准,此时rotation=1.
  20. 向顺时针旋转,则rotation为正数且不断变大,当旋转360度时,rotation大概为6左右,如果继续顺时针旋转,则角度会不断增加,两圈为12左右,此时若逆时针旋转,角度则不断变小
  21. 向逆时针旋转,则rotation为负数且不断变小,当旋转360度时,rotation大概为-6左右
  22. velocity属性: 可以理解为两手指之间的移动速度,其实是个速度比例,相对速度,不是绝对速度
  23. 以刚开始的两个手指对应的两个point的之间的距离为标准,此时velocity=0.
  24. 若两手指向顺时针旋转,则velocity为正数,从0开始,随着手指向里捏合的速度越快,值越大,没有上限
  25. 若两手指向逆时针旋转,则velocity为负数数,没有上限,从-0开始,随着手指向外捏合的速度越快,值越小,没有上限
  26. */
  27. CGFloat rotation = gestureRecognizer.rotation;
  28. NSLog(@"===rotation: %f", rotation);
  29. CGFloat velocity = gestureRecognizer.velocity;
  30. NSLog(@"======velocity: %f", velocity);
  31. /*
  32. 旋转手势
  33. 这个一般情况下只响应
  34. UIGestureRecognizerStateBegan、
  35. UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized、
  36. UIGestureRecognizerStateChanged消息,
  37. 一个UIGestureRecognizerStateBegan,接下去是N多的UIGestureRecognizerStateChanged,scale的值此时会不断的变化,当手指离开时,响应UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized
  38. */
  39. switch (gestureRecognizer.state) {
  40. case UIGestureRecognizerStateEnded:{ // UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded
  41. NSLog(@"======UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized");
  42. break;
  43. }
  44. case UIGestureRecognizerStateBegan:{ //
  45. NSLog(@"======UIGestureRecognizerStateBegan");
  46. break;
  47. }
  48. case UIGestureRecognizerStateChanged:{ //
  49. NSLog(@"======UIGestureRecognizerStateChanged");
  50. gestureRecognizer.view.transform = CGAffineTransformRotate(gestureRecognizer.view.transform, gestureRecognizer.rotation);
  51. gestureRecognizer.rotation = 0; // 重置 这个相当重要!!!
  52. break;
  53. }
  54. case UIGestureRecognizerStateCancelled:{ //
  55. NSLog(@"======UIGestureRecognizerStateCancelled");
  56. break;
  57. }
  58. case UIGestureRecognizerStateFailed:{ //
  59. NSLog(@"======UIGestureRecognizerStateFailed");
  60. break;
  61. }
  62. case UIGestureRecognizerStatePossible:{ //
  63. NSLog(@"======UIGestureRecognizerStatePossible");
  64. break;
  65. }
  66. default:{
  67. NSLog(@"======Unknow gestureRecognizer");
  68. break;
  69. }
  70. }
  71. }

UISwipeGestureRecognizer

[cpp] view plaincopy

  1. - (void)viewDidLoad
  2. {
  3. [super viewDidLoad];
  4. // Do any additional setup after loading the view from its nib.
  5. /*
  6. 同一个手势只能指定一个方向,不能同时指定多个方向,要指定多个方向 必须用多个手势
  7. */
  8. // right
  9. UISwipeGestureRecognizer *swipeGestureRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
  10. if (![swipeGestureRight respondsToSelector:@selector(locationInView:)]) {
  11. [swipeGestureRight release];
  12. swipeGestureRight = nil;
  13. }else {
  14. swipeGestureRight.delegate = self;
  15. swipeGestureRight.numberOfTouchesRequired = 1;// 手指个数 The default value is 1.
  16. swipeGestureRight.direction = UISwipeGestureRecognizerDirectionRight;// 同一个手势只能指定一个方向,不能同时指定多个方向,要指定多个方向 必须用多个手势
  17. [self.view addGestureRecognizer:swipeGestureRight];
  18. }
  19. // left
  20. UISwipeGestureRecognizer *swipeGestureLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
  21. if (![swipeGestureLeft respondsToSelector:@selector(locationInView:)]) {
  22. [swipeGestureLeft release];
  23. swipeGestureLeft = nil;
  24. }else {
  25. swipeGestureLeft.delegate = self;
  26. swipeGestureLeft.numberOfTouchesRequired = 1;// 手指个数 The default value is 1.
  27. swipeGestureLeft.direction = UISwipeGestureRecognizerDirectionLeft;// 同一个手势只能指定一个方向,不能同时指定多个方向,要指定多个方向 必须用多个手势
  28. [self.view addGestureRecognizer:swipeGestureLeft];
  29. }
  30. // Up
  31. UISwipeGestureRecognizer *swipeGestureUp = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
  32. if (![swipeGestureUp respondsToSelector:@selector(locationInView:)]) {
  33. [swipeGestureUp release];
  34. swipeGestureUp = nil;
  35. }else {
  36. swipeGestureUp.delegate = self;
  37. swipeGestureUp.numberOfTouchesRequired = 1;// 手指个数 The default value is 1.
  38. swipeGestureUp.direction = UISwipeGestureRecognizerDirectionUp;// 同一个手势只能指定一个方向,不能同时指定多个方向,要指定多个方向 必须用多个手势
  39. [self.view addGestureRecognizer:swipeGestureUp];
  40. }
  41. // Down
  42. UISwipeGestureRecognizer *swipeGestureDown = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
  43. if (![swipeGestureDown respondsToSelector:@selector(locationInView:)]) {
  44. [swipeGestureDown release];
  45. swipeGestureDown = nil;
  46. }else {
  47. swipeGestureDown.delegate = self;
  48. swipeGestureDown.numberOfTouchesRequired = 1;// 手指个数 The default value is 1.
  49. swipeGestureDown.direction = UISwipeGestureRecognizerDirectionDown;// 同一个手势只能指定一个方向,不能同时指定多个方向,要指定多个方向 必须用多个手势
  50. [self.view addGestureRecognizer:swipeGestureDown];
  51. }
  52. }
  53. - (void)handleGesture:(UISwipeGestureRecognizer *)gestureRecognizer
  54. {
  55. UIView *view = [gestureRecognizer view]; // 这个view是手势所属的view,也就是增加手势的那个view
  56. /*
  57. direction属性: 用来指明手势滑动的方向的。
  58. */
  59. UISwipeGestureRecognizerDirection direction = gestureRecognizer.direction;
  60. switch (direction) {
  61. case UISwipeGestureRecognizerDirectionRight:
  62. {
  63. NSLog(@"direction==UISwipeGestureRecognizerDirectionRight");
  64. break;
  65. }
  66. case UISwipeGestureRecognizerDirectionLeft:
  67. {
  68. NSLog(@"direction==UISwipeGestureRecognizerDirectionLeft");
  69. break;
  70. }
  71. case UISwipeGestureRecognizerDirectionUp:
  72. {
  73. NSLog(@"direction==UISwipeGestureRecognizerDirectionUp");
  74. break;
  75. }
  76. case UISwipeGestureRecognizerDirectionDown:
  77. {
  78. NSLog(@"direction==UISwipeGestureRecognizerDirectionDown");
  79. break;
  80. }
  81. default:
  82. break;
  83. }
  84. /*
  85. 轻扫手势
  86. 这个一般情况下只响应UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized
  87. */
  88. switch (gestureRecognizer.state) {
  89. case UIGestureRecognizerStateEnded:{ // UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded
  90. NSLog(@"======UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized");
  91. break;
  92. }
  93. default:{
  94. NSLog(@"======Unknow gestureRecognizer");
  95. break;
  96. }
  97. }
  98. }

UIPanGestureRecognizer

[cpp] view plaincopy

  1. - (void)viewDidLoad
  2. {
  3. [super viewDidLoad];
  4. // Do any additional setup after loading the view from its nib.
  5. UIView *view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
  6. view.backgroundColor = [UIColor blueColor];
  7. [self.view addSubview:view];
  8. UIPanGestureRecognizer *panPressGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
  9. if (![panPressGesture respondsToSelector:@selector(locationInView:)]) {
  10. [panPressGesture release];
  11. panPressGesture = nil;
  12. }else {
  13. panPressGesture.delegate = self;
  14. panPressGesture.maximumNumberOfTouches = NSUIntegerMax;// The default value is NSUIntegerMax.
  15. /*
  16. NSUIntegerMax : The maximum value for an NSUInteger.
  17. */
  18. panPressGesture.minimumNumberOfTouches = 1;// The default value is 1.
  19. [view addGestureRecognizer:panPressGesture];
  20. }
  21. }
  22. // 拖拽手势
  23. - (void)handleGesture:(UIPanGestureRecognizer *)gestureRecognizer
  24. {
  25. UIView *view = [gestureRecognizer view]; // 这个view是手势所属的view,也就是增加手势的那个view
  26. switch (gestureRecognizer.state) {
  27. case UIGestureRecognizerStateBegan:{
  28. NSLog(@"======UIGestureRecognizerStateBegan");
  29. break;
  30. }
  31. case UIGestureRecognizerStateChanged:{
  32. NSLog(@"======UIGestureRecognizerStateChanged");
  33. /*
  34. 让view跟着手指移动
  35. 1.获取每次系统捕获到的手指移动的偏移量translation
  36. 2.根据偏移量translation算出当前view应该出现的位置
  37. 3.设置view的新frame
  38. 4.将translation重置为0(十分重要。否则translation每次都会叠加,很快你的view就会移除屏幕!)
  39. */
  40. CGPoint translation = [gestureRecognizer translationInView:self.view];
  41. view.center = CGPointMake(gestureRecognizer.view.center.x + translation.x, gestureRecognizer.view.center.y + translation.y);
  42. [gestureRecognizer setTranslation:CGPointMake(0, 0) inView:self.view];//  注意一旦你完成上述的移动,将translation重置为0十分重要。否则translation每次都会叠加,很快你的view就会移除屏幕!
  43. break;
  44. }
  45. case UIGestureRecognizerStateCancelled:{
  46. NSLog(@"======UIGestureRecognizerStateCancelled");
  47. break;
  48. }
  49. case UIGestureRecognizerStateFailed:{
  50. NSLog(@"======UIGestureRecognizerStateFailed");
  51. break;
  52. }
  53. case UIGestureRecognizerStatePossible:{
  54. NSLog(@"======UIGestureRecognizerStatePossible");
  55. break;
  56. }
  57. case UIGestureRecognizerStateEnded:{ // UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded
  58. /*
  59. 当手势结束后,view的减速缓冲效果
  60. 模拟减速写的一个很简单的方法。它遵循如下策略:
  61. 计算速度向量的长度(i.e. magnitude)
  62. 如果长度小于200,则减少基本速度,否则增加它。
  63. 基于速度和滑动因子计算终点
  64. 确定终点在视图边界内
  65. 让视图使用动画到达最终的静止点
  66. 使用“Ease out“动画参数,使运动速度随着时间降低
  67. */
  68. NSLog(@"======UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized");
  69. CGPoint velocity = [gestureRecognizer velocityInView:self.view];// 分别得出x,y轴方向的速度向量长度(velocity代表按照当前速度,每秒可移动的像素个数,分xy轴两个方向)
  70. CGFloat magnitude = sqrtf((velocity.x * velocity.x) + (velocity.y * velocity.y));// 根据直角三角形的算法算出综合速度向量长度
  71. // 如果长度小于200,则减少基本速度,否则增加它。
  72. CGFloat slideMult = magnitude / 200;
  73. NSLog(@"magnitude: %f, slideMult: %f", magnitude, slideMult);
  74. float slideFactor = 0.1 * slideMult; // Increase for more of a slide
  75. // 基于速度和滑动因子计算终点
  76. CGPoint finalPoint = CGPointMake(view.center.x + (velocity.x * slideFactor),
  77. view.center.y + (velocity.y * slideFactor));
  78. // 确定终点在视图边界内
  79. finalPoint.x = MIN(MAX(finalPoint.x, 0), self.view.bounds.size.width);
  80. finalPoint.y = MIN(MAX(finalPoint.y, 0), self.view.bounds.size.height);
  81. [UIView animateWithDuration:slideFactor*2 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
  82. view.center = finalPoint;
  83. } completion:nil];
  84. break;
  85. }
  86. default:{
  87. NSLog(@"======Unknow gestureRecognizer");
  88. break;
  89. }
  90. }
  91. }

UILongPressGestureRecognizer

[cpp] view plaincopy

    1. - (void)viewDidLoad
    2. {
    3. [super viewDidLoad];
    4. // Do any additional setup after loading the view from its nib.
    5. UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
    6. if (![longPressGesture respondsToSelector:@selector(locationInView:)]) {
    7. [longPressGesture release];
    8. longPressGesture = nil;
    9. }else {
    10. longPressGesture.delegate = self;
    11. longPressGesture.numberOfTapsRequired = 0;      // The default number of taps is 0.
    12. longPressGesture.minimumPressDuration = 0.1f;    // The default duration is is 0.5 seconds.
    13. longPressGesture.numberOfTouchesRequired = 1;   // The default number of fingers is 1.
    14. longPressGesture.allowableMovement = 10;        // The default distance is 10 pixels.
    15. [self.view addGestureRecognizer:longPressGesture];
    16. }
    17. }
    18. - (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer
    19. {
    20. UIView *view = [gestureRecognizer view]; // 这个view是手势所属的view,也就是增加手势的那个view
    21. switch (gestureRecognizer.state) {
    22. case UIGestureRecognizerStateEnded:{ // UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded
    23. NSLog(@"======UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized");
    24. break;
    25. }
    26. case UIGestureRecognizerStateBegan:{ //
    27. NSLog(@"======UIGestureRecognizerStateBegan");
    28. break;
    29. }
    30. case UIGestureRecognizerStateChanged:{ //
    31. NSLog(@"======UIGestureRecognizerStateChanged");
    32. break;
    33. }
    34. case UIGestureRecognizerStateCancelled:{ //
    35. NSLog(@"======UIGestureRecognizerStateCancelled");
    36. break;
    37. }
    38. case UIGestureRecognizerStateFailed:{ //
    39. NSLog(@"======UIGestureRecognizerStateFailed");
    40. break;
    41. }
    42. case UIGestureRecognizerStatePossible:{ //
    43. NSLog(@"======UIGestureRecognizerStatePossible");
    44. break;
    45. }
    46. default:{
    47. NSLog(@"======Unknow gestureRecognizer");
    48. break;
    49. }
    50. }
    51. }
    52. // 询问一个手势接收者是否应该开始解释执行一个触摸接收事件
    53. - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
    54. CGPoint currentPoint = [gestureRecognizer locationInView:self.view];
    55. if (CGRectContainsPoint(CGRectMake(0, 0, 100, 100), currentPoint) ) {
    56. return YES;
    57. }
    58. return NO;
    59. }
    60. // 询问delegate,两个手势是否同时接收消息,返回YES同事接收。返回NO,不同是接收(如果另外一个手势返回YES,则并不能保证不同时接收消息)the default implementation returns NO。
    61. // 这个函数一般在一个手势接收者要阻止另外一个手势接收自己的消息的时候调用
    62. - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
    63. return NO;
    64. }
    65. // 询问delegate是否允许手势接收者接收一个touch对象
    66. // 返回YES,则允许对这个touch对象审核,NO,则不允许。
    67. // 这个方法在touchesBegan:withEvent:之前调用,为一个新的touch对象进行调用
    68. - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
    69. return YES;

转自:http://blog.csdn.net/namehzf/article/details/7424882

时间: 2024-08-24 17:00:35

手势知多少的相关文章

支付宝钱包手势密码破解实战

背景 随着移动互联网的普及以及手机屏幕越做越大等特点,在移动设备上购物.消费已是人们不可或缺的一个生活习惯了.随着这股浪潮的兴起,安全.便捷的移动支付需求也越来越大.因此,各大互联网公司纷纷推出了其移动支付平台.其中,用的比较多的要数腾讯的微信和阿里的支付宝钱包了.就我而言,平时和同事一起出去AA吃饭,下班回家打车等日常生活都已经离不开这两个支付平台了. 正所谓树大招风,移动支付平台的兴起,也给众多一直徘徊在网络阴暗地带的黑客们又一次重生的机会.因为移动平台刚刚兴起,人们对移动平台的安全认识度还

【原创:参赛作品】窥视懒人的秘密---android下拉刷新开启手势的新纪元

小飒的成长史原创作品:窥视懒人的秘密---android下拉刷新开启手势的新纪元转载请注明出处 *****************************************************************        前言:窥视懒人那些不为人知的秘密 ***************************************************************** 作为一个程序员,哪有不勤奋的道理,当我们都在为技术奋不顾身的时候.偏偏懒人创造了世界. 有的

微信小程序开发日记——高仿知乎日报(上)

本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP 要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该教程分为以下三篇 微信小程序开发日记--高仿知乎日报(上) 微信小程序开发日记--高仿知乎日报(中) 微信小程序开发日记--高仿知乎日报(下) 三篇分别讲不同的组件和功能块 这篇要讲 API分析 启动页 轮播图 日报列表 浮动按钮 侧滑菜单 API分析 以下是使用到的具体API,更加详细参数和返回结

Ubuntu下触控板手势调节软件xSwipe

楼主进了一台Thinkpad T450s,触控板支持4点触控,安装了ubuntu14.04 LTS之后,触控板只剩下双指滑动了,略有不爽,各种google,百度. 真找到办法了. 首先得知了touchegg,但是各种安装不上,折腾的我心力焦悴,最后偶然在知乎上有一位伙伴说了他的电脑用xSwipe搞定了. 于是转向xSwipe,在开源项目网站上GitHub上找到了这神器. 传送门,或者复制地址:https://github.com/iberianpig/xSwipe  到地址栏打开,可能打开得很慢

手势分发机制

手势分发机制 dispatchTouchEvent分发 直接开始任务吗? false 我再想一想 自己的onIntercept拦截 true 开始埋头苦干吧 自己的onTouch处理 onInterceptTouchEvent拦截 拦截掉任务吗? false 交给下面的去做 下级的 dispatch分发 true 自己的事自己做 自己的onTouch处理 onTouchEvent处理 我能解决任务吗? false 交给上面的去做 上级的onTouch处理 true 我能完成任务 事件消失 来自为

windows触控手势

触控板手势 简而言之,在这篇文章里,触控手势1到4可以在任何一种触控板上使用,而手势5到8则需要精确触控板. 1.拖拽 要模拟鼠标的拖拽功能,只需要将一个手指在某个项目上轻轻的双击一下,然后就可以拖拽它了.当拖拽到需要的位置时抬起指尖,就可以把这个项目放置到所在的地方. 2.滚屏 要模拟鼠标的滚屏功能,只需要将两个手指在你想要滚屏的地方按下并向屏幕滚动的方向拖动即可.这个功能对任何支持滚屏的应用程序都有效,包括文字处理.网络浏览器以及音乐播放器等,而且支持横向和纵向滚屏. 3.缩放 要模拟在大多

手势密码

Activity基类 public class BaseActivity extends Activity {     @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         MyActivityManager.getInstance().push(this);     }     @Override     pro

仿知乎安卓client滑动删除撤销ListView

标签(空格分隔): Android 新版的知乎安卓client有一个有趣的功能,就是在一个item里.向右滑动时整个item会越来越透明,滑动到一半时,整个item就不见了.放开手指就是删除.删除后还能够撤销,第一次看见这个功能觉得非常有意思,用了几天业余时间,我仿造里一个.效果例如以下: 那以下就来想想看怎么实现的,大概能够先分解为三部分: 手指滑动删除item 删除item后的撤销功能 滑动时的效果处理 提醒一下假设你对scroller不熟悉.能够先看一下scroller实现原理 先来看最基

支付宝钱包手势密码破解实战(root过的手机可直接绕过手势密码)

/* 本文章由 莫灰灰 编写,转载请注明出处. 作者:莫灰灰    邮箱: [email protected] */ 背景 随着移动互联网的普及以及手机屏幕越做越大等特点,在移动设备上购物.消费已是人们不可或缺的一个生活习惯了.随着这股浪潮的兴起,安全.便捷的移动支付需求也越来越大.因此,各大互联网公司纷纷推出了其移动支付平台.其中,用的比较多的要数腾讯的微信和阿里的支付宝钱包了.就我而言,平时和同事一起出去AA吃饭,下班回家打车等日常生活都已经离不开这两个支付平台了. 正所谓树大招风,移动支付