将UILongPressGestureRecognizer与UIPanGestureRecognizer组合在一起

V1r*_*ru8 19 cocoa-touch objective-c uigesturerecognizer uipangesturerecognizer uilongpressgesturerecogni

我喜欢将UILongPressGestureRecognizer与UIPanGestureRecognizer结合使用.

UIPanGestureRecognizer应该从长按开始.有一个简单的方法吗?还是我真的要写自己的手势识别器?

我不喜欢在主屏幕上.你按下一个图标,一段时间后图标开始摇晃.之后我没有从屏幕上松开手指,我可以开始拖动手指下的图标.

小智 21

实际上,您不必组合手势识别器 - 您只能使用UILongPressGestureRecognizer执行此操作...一旦您的触摸在'allowableMovement'中保持'minimumPressDuration',您就进入StateBegan.只要你不抬起任何手指,你就会保持连续的longPressGesture - 所以你可以开始移动手指并通过StateChanged跟踪运动.

长按手势是连续的.当指定时间段(minimumPressDuration)按下允许的手指数(numberOfTouchesRequired)并且触摸不超出允许的移动范围(allowableMovement)时,手势开始(UIGestureRecognizerStateBegan).每当手指移动时,手势识别器转换到改变状态,并且当任何手指被抬起时,手势识别器结束(UIGestureRecognizerStateEnded).

  • 你可以遇到很多问题.关于UIPanGestureRecognizer最好的一点是它可以让你平移整个窗口并仍然返回值,而UILongPressGestureRecognizer不会留下子视图(至少那些带有ClipsToBounds) (4认同)
  • 另外,在移动LongPress时,没有“速度”可用 (2认同)

And*_*y B 18

我遇到这个问题有点困难.接受的答案还不够.无论我在该方法中使用什么,都会调用pan或longpress处理程序.我找到的解决方案如下:

  1. 确保将手势识别器的委托分配到同一个类(在我的情况下为self)并确保委托类是a UIGestureRecognizerDelegate.
  2. 将以下委托方法添加到您的类中(根据上面的答案):

    - (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
    shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
         return YES;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将以下委托方法添加到您的类:

    - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
         if([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && ! shouldAllowPan) {
              return NO;
         }
         return YES;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 然后添加一个属性或ivar,它将跟踪是否应该允许平底锅开始(参见上面的方法).就我而言BOOL shouldAllowPan.

  5. 将BOOL设置为NO您的initviewDidLoad.在你的longPress处理程序中设置BOOL为YES.我是这样做的:

    - (void) longPressHandler: (UILongPressGestureRecognizer *) gesture {
    
         if(UIGestureRecognizerStateBegan == gesture.state) {
            shouldAllowPan = NO;
         }
    
         if(UIGestureRecognizerStateChanged == gesture.state) {
            shouldAllowPan = YES;
         }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  6. 在panHandler中我检查BOOL:

    - (void)panHandler:(UIPanGestureRecognizer *)sender{
        if(shouldAllowPan) {
              // do your stuff
        }
    
    Run Code Online (Sandbox Code Playgroud)
  7. 最后在panHandler中重置BOOL:

    else if(sender.state == UIGestureRecognizerStateEnded || sender.state == UIGestureRecognizerStateFailed || sender.state == UIGestureRecognizerStateCancelled) {
        shouldAllowPan = NO;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  8. 然后去喝啤酒祝贺自己.;)


V1r*_*ru8 16

我找到了一个解决方案:这个UIGestureRecognizerDelegate方法完全符合我的要求:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
Run Code Online (Sandbox Code Playgroud)


duy*_*yen 8

Andy B在Swift中的方法,

  1. UIGestureRecognizerDelegate委托添加到类中

    class ViewController: UIViewController, UIGestureRecognizerDelegate
    
    Run Code Online (Sandbox Code Playgroud)
  2. 添加成员变量

    var shouldAllowPan: Bool = false
    
    Run Code Online (Sandbox Code Playgroud)
  3. 添加手势并需要将平移手势委托添加到VC.这需要触发shouldRecognizeSimultaneouslyWithGestureRecognizer和gestureRecognizerShouldBegin函数

    // long press
    let longPressRec = UILongPressGestureRecognizer(target: self, action: "longPress:")
    yourView.addGestureRecognizer(longPressRec)
    
    // drag
    let panRec = UIPanGestureRecognizer(target: self, action: "draggedView:")
    panRec.delegate = self
    yourView.addGestureRecognizer(panRec)
    
    Run Code Online (Sandbox Code Playgroud)
  4. 允许同时手势

    func gestureRecognizer(UIGestureRecognizer,
    shouldRecognizeSimultaneouslyWithGestureRecognizer:UIGestureRecognizer) -> Bool {
        // println("shouldRecognizeSimultaneouslyWithGestureRecognizer");
        return true
    }
    
    func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool {
         // We only allow the (drag) gesture to continue if it is within a long press
         if((gestureRecognizer is UIPanGestureRecognizer) && (shouldAllowPan == false)) {
             return false;
         }
         return true;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  5. 在长按处理机内:

    func longPress(sender: UILongPressGestureRecognizer) {
    
        if(sender.state == .Began) {
            // handle the long press
        }
        else if(sender.state == .Changed){
            shouldAllowPan = true
    
        }
        else if (sender.state == .Ended) {
            shouldAllowPan = false
        }
    } 
    
    Run Code Online (Sandbox Code Playgroud)

  • 你忘记了6.拿一杯啤酒.:) :) (4认同)