【问题标题】:Gesture problem: UISwipeGestureRecognizer + UISlider手势问题:UISwipeGestureRecognizer + UISlider
【发布时间】:2011-06-13 12:47:59
【问题描述】:

遇到了与手势相关的问题。我实现了 UISwipeGestureRecognizer 来获取左右滑动事件,并且工作正常。但是我面临的问题是,我在同一视图中的 UISlider 表现不佳。滑块的滑动动作被误认为是向左/向右滑动。

有没有人遇到过这个问题,有什么解决办法吗?

非常感谢。

这是视图控制器中包含的代码:

 - (void)viewDidLoad {

            [super viewDidLoad];

                //Setup handling of LEFT and RIGHT swipes
             UISwipeGestureRecognizer *recognizer;

                recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
                [recognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
                [[self view] addGestureRecognizer:recognizer];
                [recognizer release];

                recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
                [recognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)];
                [[self view] addGestureRecognizer:recognizer];
                [recognizer release];
        }

    -(void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer {

      if (recognizer.direction == UISwipeGestureRecognizerDirectionRight) {
       NSLog(@"Swipe Right");
       //Do stuff
      }

      if (recognizer.direction == UISwipeGestureRecognizerDirectionLeft) {
       NSLog(@"Swipe Left");
       //Do stuff
      }
    }

【问题讨论】:

    标签: iphone event-handling uislider uigesturerecognizer gesture-recognition


    【解决方案1】:

    处理此问题的最简单方法可能是防止手势识别器看到您的滑块上的触摸。你可以通过将自己设置为委托,然后实现

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
        if ([touch.view isKindOfClass:[UISlider class]]) {
            // prevent recognizing touches on the slider
            return NO;
        }
        return YES;
    }
    

    如果这不起作用,则滑块可能实际上具有接收触摸的子视图,因此您可以沿着superview 链向上走,沿途测试每个视图。

    【讨论】:

    • 关键点: 您可以通过将自己设置为代表,然后实施 - 这类似于[panRecognizer setDelegate:self] - 不是UISlider(取决于您的命名和类设置等)。另外,很棒的答案。
    • 不完整的答案也是错误的。不要使用。
    • @AlexKornhauser 请详细说明。
    • 未指定如何使用委托。
    • @AlexKornhauser “我如何使用手势识别器委托?”不是这个问题的重点。这是文档回答的问题。请不要将答案声明为“错误”,因为它们假定您已经了解官方文档解释的基础知识。
    【解决方案2】:

    Swift 4.0 版本。 不要忘记 UIGestureRecognizerDelegate。

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
    
        if let touchedView = touch.view, touchedView.isKind(of: UISlider.self) {
            return false
        }
    
        return true
    }
    

    【讨论】:

      【解决方案3】:

      就在莉莉在上面做出回应之前,我最终完成了这项工作。这是我使用的代码,但 Lily 看起来更干净(尚未测试 Lily 的你):

      - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
          BOOL AllowSwipes = YES;
      
              CGPoint point1 = [touch locationInView:_sliderLeft];
              CGPoint point2 = [touch locationInView:_sliderRight];
      
              //Left slider test
              if ([_sliderLeft hitTest:point1 withEvent:nil] != nil) {
                  AllowSwipes = NO;
                  NSLog(@"On Left Slider");
              }
      
              //Right slider test
              if ([_sliderRight hitTest:point2 withEvent:nil] != nil) {
                  AllowSwipes = NO;
                  NSLog(@"On Right Slider");
              }
          }
          return AllowSwipes;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多