我喜欢将UilongPressEntrererecognizer与uipangeSturerecognizer相结合。

uipangeSturerognizer应该从长期按下开始。有什么简单的方法吗?还是我真的必须写自己的手势识别器?

我不会在主屏幕上。您按照图标,一段时间后,图标开始摆动。之后,没有从屏幕上释放我的手指,我可以开始将图标拖到手指下。

有帮助吗?

解决方案 3

我找到了一个解决方案:这种UigeSturerEcognizerdelegate方法确实可以做到我所寻找的:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

其他提示

实际上,您不必结合手势识别器 - 您只能使用UilongPressestureRecognizer进行此操作...一旦您的触摸(ES)留在'washerableMovement'中,您就可以输入statebegan。只要您不抬起任何手指,您就可以保持连续的长期灾难 - 这样您就可以开始移动手指并通过Statechanged跟踪运动。

长压手势是连续的。当在指定期间(MinimMimPressDuration)按下允许的手指(NumberOftouchesRequired)时,手势开始(UigeSturerEcognizerStateBegan),并且触摸并不能超出允许的运动范围(允许AblobableMovement)。每当手指移动时,手势识别器都会过渡到变化状态,当任何手指抬起时,它都会结束(Uigesturerecognizerstate)。

我在这个问题上有些困难。公认的答案还不够。无论我在这种方法中采用什么,PAN或Longpress处理程序都会被调用。我发现的解决方案如下:

  1. 确保手势识别者的代表被分配给同一类(就我而言),并确保代表类是一个 UIGestureRecognizerDelegate.
  2. 将以下委托方法添加到您的课程中(根据上述答案):

    - (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
    shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
         return YES;
    }
    
  3. 将以下委托方法添加到您的课程中:

    - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
         if([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && ! shouldAllowPan) {
              return NO;
         }
         return YES;
    }
    
  4. 然后添加属性或IVAR,该属性将跟踪是否允许锅开始(请参见上面的方法)。就我而言 BOOL shouldAllowPan.

  5. 将布尔设置为 NO 在你的 init 或者 viewDidLoad. 。在您的Longpress处理程序内部将布尔设置为 YES. 。我这样做:

    - (void) longPressHandler: (UILongPressGestureRecognizer *) gesture {
    
         if(UIGestureRecognizerStateBegan == gesture.state) {
            shouldAllowPan = NO;
         }
    
         if(UIGestureRecognizerStateChanged == gesture.state) {
            shouldAllowPan = YES;
         }
    }
    
  6. 在Panhandler内部,我对布尔进行检查:

    - (void)panHandler:(UIPanGestureRecognizer *)sender{
        if(shouldAllowPan) {
              // do your stuff
        }
    
  7. 最后重置panhandler中的布尔:

    else if(sender.state == UIGestureRecognizerStateEnded || sender.state == UIGestureRecognizerStateFailed || sender.state == UIGestureRecognizerStateCancelled) {
        shouldAllowPan = NO;
    }
    
  8. 然后去拿一杯啤酒祝贺自己。 )

安迪·B(Andy B)在迅速的方法

  1. 添加 uigesturercognizerdelegate 委托

    class ViewController: UIViewController, UIGestureRecognizerDelegate
    
  2. 添加成员变量

    var shouldAllowPan: Bool = false
    
  3. 添加手势,并需要将PAN手势委托添加到VC中。这是必要的,以释放应有的质量认知和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)
    
  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;
    }
    
  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
        }
    } 
    

阅读Apple的UigeSturerecognizer类参考的“子分类说明”部分:

https://developer.apple.com/library/prerelease/tvos/documentation/uikit/reference/uigesturerecognizer_class/

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top