The concrete subclasses of UIGestureRecognizer are the following:

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

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

各个手势使用时的代码:

UITapGestureRecognizer

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

UIPinchGestureRecognizer

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

UIRotationGestureRecognizer

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

UISwipeGestureRecognizer

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

UIPanGestureRecognizer

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

UILongPressGestureRecognizer

  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;
  70. }

本文转载至  http://blog.csdn.net/namehzf/article/details/7424882

UIGestureRecognizer学习笔记2的更多相关文章

  1. UIGestureRecognizer学习笔记

    一.Gesture Recognizers Gesture Recognizers是在iOS3.2引入的,可以用来识别手势.简化定制视图事件处理的对象.Gesture Recognizers的基类为U ...

  2. iOS学习笔记--触摸事件

    最近空闲时间在学习iOS相关知识,几周没有更新文章了,今天总结下这些天的学习内容,也整理下iOS的学习笔记,以便以后查阅翻看- iOS中的事件可以分为3大类型: 触摸事件 加速计事件 远程控制事件 响 ...

  3. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  4. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  5. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  6. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  7. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  8. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  9. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

随机推荐

  1. 使用conda 对gcc进行升级 (sonicparanoid)

    由于要是用python 3.6版本的一个包sonicparanoid,但是系统的gcc比较老,所以先用conda创建python环境,在该环境下尽心gcc的安装和升级 conda create --n ...

  2. python基础系列教程——Python的安装与测试:python的IDE工具PyDev和pycharm,anaconda

    ---恢复内容开始--- python基础系列教程——Python的安装与测试:python的IDE工具PyDev和pycharm,anaconda 从头开启python的开发环境搭建.安装比较简单, ...

  3. Hadoop计算中的Shuffle过程(转)

    Hadoop计算中的Shuffle过程 作者:左坚 来源:清华万博 时间:2013-07-02 15:04:44.0 Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方.要想理解Ma ...

  4. mongodb查询之从多种分类中获取各分类最新一条记录

    mongodb查询之从多种分类中获取各分类最新一条记录 2017年04月06日 13:02:47 monkey_four 阅读数:6707更多 个人分类: MongoDBJavaScript   文章 ...

  5. -27979 LoadRunner 错误27979 找不到请求表单 Action.c(73): Error -27979: Requested form not found

    LoadRunner请求无法找到:在录制Web协议脚本回放脚本的过程中,会出现请求无法找到的现象,而导致脚本运行停止. 错误现象:Action.c(41): Error -27979: Request ...

  6. Qt 线程基础(QThread、QtConcurrent等)

    [-] 使用线程 何时使用其他技术替代线程 应该使用 Qt 线程的哪种技术 Qt线程基础 QObject与线程 使用互斥量保护数据的完整 使用事件循环防止数据破坏 处理异步执行 昨晚看Qt的Manua ...

  7. 《FPGA全程进阶---实战演练》第三章之PCB设计之电感、磁珠和零欧姆电阻

    2.电感.磁珠和零欧姆电阻的区别 电感:电感是储能元件,多用于电源滤波回路.LC振荡电路.中低频滤波电路等,其应用频率很少超过50MHz.对电感而言,其感抗值和频率成正比.XL = 2πfL来说明,其 ...

  8. 【转】7Z命令行解压缩

    7z.exe在CMD窗口的使用说明如下: 7-Zip (A) 4.57 Copyright (c) 1999-2007 Igor Pavlov 2007-12-06 Usage: 7za <co ...

  9. 单例模式/ java实现附代码 /

    注: 场景和例子出自github的设计模式.传送门:https://github.com/iluwatar/java-design-patterns/tree/master/singleton 意图: ...

  10. perl 利用管道读取压缩文件内容

    perl的文件句柄不仅支持普通文件, 还支持管道,今天需要统计一个fastq文件中的序列数和碱基数,而NGS的fastq文件一般都是gzip压缩的,所以 需要读取压缩文件中的内容,代码如下: my ( ...