質問

UilongpressgestureRecognizerとuipangestureRecognizerを組み合わせたいと思います。

uipangesturerecognizerは、長い報道から始める必要があります。これを行う簡単な方法はありますか?それとも、私は本当に自分のジェスチャー認識者を書く必要がありますか?

私はホーム画面上ではそうではありません。アイコンを押して、しばらくするとアイコンがぐらつき始めます。その後、画面から指をリリースせずに、指の下にアイコンをドラッグし始めることができます。

役に立ちましたか?

解決 3

解決策を見つけました:このuigesturerecognizerdelegateメソッドは、私が探していたものを正確に行います。

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

他のヒント

実際、ジェスチャー認識者を組み合わせる必要はありません - これをuilongpressgesturerecognizerでのみ行うことができます...タッチ(es)が「minimumpressduration」のために「許容範囲」内にとどまると、ステートベガンに入ります。指を持ち上げない限り、継続的なlongpressgestureにとどまります。したがって、指を動かし始めて、ステータスを介して動きを追跡できます。

ロングプレスジェスチャーは連続しています。ジェスチャーは、指定された期間(minimumpressduration)のために許容指の数(numberoftouchesrequed)が押され、タッチが許容範囲の移動範囲(許容範囲)を超えて移動しないときに、ジェスチャーが始まります(uigesturerecognizerstatebegan)。ジェスチャー認識は、指が移動するたびに変化状態に移行し、指が持ち上げられたときに終了します(uigesturerecognizerStateded)。

この問題に少し苦労しました。受け入れられた答えは十分ではありませんでした。その方法に何を入れても、パンやロングプレスハンドラーが呼び出されます。私が見つけた解決策は次のとおりでした:

  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. 次に、PANを開始できるかどうかを追跡するプロパティまたは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. パンハンドラーの内部では、ブールのチェックを行います。

    - (void)panHandler:(UIPanGestureRecognizer *)sender{
        if(shouldAllowPan) {
              // do your stuff
        }
    
  7. そして最後に、パンハンドラー内のブールをリセットします。

    else if(sender.state == UIGestureRecognizerStateEnded || sender.state == UIGestureRecognizerStateFailed || sender.state == UIGestureRecognizerStateCancelled) {
        shouldAllowPan = NO;
    }
    
  8. そして、自分自身を祝福するためにビールをつかみに行きます。 ;)

SwiftでのAndy Bのアプローチ、

  1. 追加します uigesturerecognizerdelegate クラスに委任します

    class ViewController: UIViewController, UIGestureRecognizerDelegate
    
  2. メンバー変数を追加します

    var shouldAllowPan: Bool = false
    
  3. ジェスチャーを追加し、VCにパンジェスチャーデリゲートを追加する必要があります。これは、gasterecognizerとgesturerecognizersershouldの機能をもたらさせて認識するために必要です。

    // 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/

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top