web-dev-qa-db-ja.com

UIGestureRecognizerに既存のタッチをキャンセルするように指示するにはどうすればよいですか?

ユーザーの指の下にあるオブジェクト(UIPanGestureRecognizer)を追跡するために使用しているUIImageViewがあります。私はX軸上の動きだけを気にし、タッチがY軸上のオブジェクトのフレームの上または下に漂う場合、私はタッチを終了したい。

タッチがオブジェクトのY境界内にあるかどうかを判断するために必要なものはすべて揃っていますが、タッチイベントをキャンセルする方法はわかりません。レコグナイザーのcancelsTouchesInViewプロパティを反転しても、私が望んでいることを実行できないようです。

ありがとう!

59
Josh French

この小さなトリックは私に役立ちます。

@implementation UIGestureRecognizer (Cancel)

- (void)cancel {
    self.enabled = NO;
    self.enabled = YES;
}

@end

から UIGestureRecognizer @enabled ドキュメンテーション:

ジェスチャー認識を無効にして、タッチを受け取らないようにします。デフォルト値はYESです。ジェスチャレコグナイザが現在ジェスチャを認識しているときにこのプロパティをNOに変更すると、ジェスチャレコグナイザはキャンセルされた状態に移行します。

150

Swiftでの@matejの回答。

extension UIGestureRecognizer {
  func cancel() {
    isEnabled = false
    isEnabled = true
  }
}
10
Hlung

Obj-C:

recognizer.enabled = NO;
recognizer.enabled = YES;

スウィフト3:

recognizer.isEnabled = false
recognizer.isEnabled = true
8
budidino

Apple docs からこれについてはどうですか:

@property(nonatomic, getter=isEnabled) BOOL enabled

ジェスチャー認識を無効にして、タッチを受け取らないようにします。デフォルト値はYESです。ジェスチャレコグナイザが現在ジェスチャを認識しているときにこのプロパティをNOに変更すると、ジェスチャレコグナイザはキャンセルされた状態に移行します。

3
Ying

ドキュメントによると、ジェスチャー認識をサブクラス化できます。

YourPanGestureRecognizer.mで:

#import "YourPanGestureRecognizer.h"

@implementation YourPanGestureRecognizer

- (void) cancelGesture {
    self.state=UIGestureRecognizerStateCancelled;
}

@end

YourPanGestureRecognizer.hで:

#import <UIKit/UIKit.h>
#import <UIKit/UIGestureRecognizerSubclass.h>

@interface NPPanGestureRecognizer: UIPanGestureRecognizer

- (void) cancelGesture;

@end

どこからでも電話できるようになりました

YourPanGestureRecognizer *panRecognizer = [[YourPanGestureRecognizer alloc] initWithTarget:self action:@selector(panMoved:)];
[self.view addGestureRecognizer:panRecognizer];
[...]
-(void) panMoved:(YourPanGestureRecognizer*)sender {
    [sender cancelGesture]; // This will be called twice
}

参照: https://developer.Apple.com/documentation/uikit/uigesturerecognizer?language=objc

1
Rémy Blanc

これを処理するにはいくつかの方法があります。

  1. カスタムパンジェスチャレコグナイザーサブクラスを作成している場合、気になるエリアから外れていることに気付いたときにレコグナイザー内部から-ignoreTouch:withEvent:を呼び出すことで簡単にこれを行うことができます。

  2. 標準のパン認識機能とタッチ開始 OKを使用しているため(デリゲート関数でそれを防止したくない場合)、実際に受け取るのは区別することだけです。認識エンジンのターゲットアクション。 translationInView:またはlocationInView:の戻り値のY値を確認し、適切にクランプします。

0
Ben Zotto