uilongpressgesturerecognizerとuipangesturerecognizerを組み合わせます
質問
UilongpressgestureRecognizerとuipangestureRecognizerを組み合わせたいと思います。
uipangesturerecognizerは、長い報道から始める必要があります。これを行う簡単な方法はありますか?それとも、私は本当に自分のジェスチャー認識者を書く必要がありますか?
私はホーム画面上ではそうではありません。アイコンを押して、しばらくするとアイコンがぐらつき始めます。その後、画面から指をリリースせずに、指の下にアイコンをドラッグし始めることができます。
解決 3
解決策を見つけました:このuigesturerecognizerdelegateメソッドは、私が探していたものを正確に行います。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
他のヒント
実際、ジェスチャー認識者を組み合わせる必要はありません - これをuilongpressgesturerecognizerでのみ行うことができます...タッチ(es)が「minimumpressduration」のために「許容範囲」内にとどまると、ステートベガンに入ります。指を持ち上げない限り、継続的なlongpressgestureにとどまります。したがって、指を動かし始めて、ステータスを介して動きを追跡できます。
ロングプレスジェスチャーは連続しています。ジェスチャーは、指定された期間(minimumpressduration)のために許容指の数(numberoftouchesrequed)が押され、タッチが許容範囲の移動範囲(許容範囲)を超えて移動しないときに、ジェスチャーが始まります(uigesturerecognizerstatebegan)。ジェスチャー認識は、指が移動するたびに変化状態に移行し、指が持ち上げられたときに終了します(uigesturerecognizerStateded)。
この問題に少し苦労しました。受け入れられた答えは十分ではありませんでした。その方法に何を入れても、パンやロングプレスハンドラーが呼び出されます。私が見つけた解決策は次のとおりでした:
- ジェスチャー認定者の代表者が同じクラス(私の場合は自己)に割り当てられていることを確認し、デリゲートクラスが
UIGestureRecognizerDelegate
. 次の代表材メソッドをクラスに追加します(上記の回答に従って):
- (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES; }
次の代表メソッドをクラスに追加します。
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { if([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && ! shouldAllowPan) { return NO; } return YES; }
次に、PANを開始できるかどうかを追跡するプロパティまたはIVARのいずれかを追加します(上記の方法を参照)。私の場合
BOOL shouldAllowPan
.にブールを設定します
NO
あなたの中でinit
またviewDidLoad
. 。 LongPressハンドラーの内側には、ブールを設定しますYES
. 。私はこのようにそれをします:- (void) longPressHandler: (UILongPressGestureRecognizer *) gesture { if(UIGestureRecognizerStateBegan == gesture.state) { shouldAllowPan = NO; } if(UIGestureRecognizerStateChanged == gesture.state) { shouldAllowPan = YES; } }
パンハンドラーの内部では、ブールのチェックを行います。
- (void)panHandler:(UIPanGestureRecognizer *)sender{ if(shouldAllowPan) { // do your stuff }
そして最後に、パンハンドラー内のブールをリセットします。
else if(sender.state == UIGestureRecognizerStateEnded || sender.state == UIGestureRecognizerStateFailed || sender.state == UIGestureRecognizerStateCancelled) { shouldAllowPan = NO; }
そして、自分自身を祝福するためにビールをつかみに行きます。 ;)
SwiftでのAndy Bのアプローチ、
追加します uigesturerecognizerdelegate クラスに委任します
class ViewController: UIViewController, UIGestureRecognizerDelegate
メンバー変数を追加します
var shouldAllowPan: Bool = false
ジェスチャーを追加し、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)
同時のジェスチャーを許可します
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; }
ロングプレスハンドラー内:
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クラスのリファレンスの「サブクラス化ノート」セクションを読む: