ユーザーの指の下にあるオブジェクト(UIPanGestureRecognizer
)を追跡するために使用しているUIImageView
があります。私はX軸上の動きだけを気にし、タッチがY軸上のオブジェクトのフレームの上または下に漂う場合、私はタッチを終了したい。
タッチがオブジェクトのY境界内にあるかどうかを判断するために必要なものはすべて揃っていますが、タッチイベントをキャンセルする方法はわかりません。レコグナイザーのcancelsTouchesInView
プロパティを反転しても、私が望んでいることを実行できないようです。
ありがとう!
この小さなトリックは私に役立ちます。
@implementation UIGestureRecognizer (Cancel)
- (void)cancel {
self.enabled = NO;
self.enabled = YES;
}
@end
から UIGestureRecognizer @enabled
ドキュメンテーション:
ジェスチャー認識を無効にして、タッチを受け取らないようにします。デフォルト値はYESです。ジェスチャレコグナイザが現在ジェスチャを認識しているときにこのプロパティをNOに変更すると、ジェスチャレコグナイザはキャンセルされた状態に移行します。
Swiftでの@matejの回答。
extension UIGestureRecognizer {
func cancel() {
isEnabled = false
isEnabled = true
}
}
Obj-C:
recognizer.enabled = NO;
recognizer.enabled = YES;
スウィフト3:
recognizer.isEnabled = false
recognizer.isEnabled = true
Apple docs からこれについてはどうですか:
@property(nonatomic, getter=isEnabled) BOOL enabled
ジェスチャー認識を無効にして、タッチを受け取らないようにします。デフォルト値はYESです。ジェスチャレコグナイザが現在ジェスチャを認識しているときにこのプロパティをNOに変更すると、ジェスチャレコグナイザはキャンセルされた状態に移行します。
ドキュメントによると、ジェスチャー認識をサブクラス化できます。
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
これを処理するにはいくつかの方法があります。
カスタムパンジェスチャレコグナイザーサブクラスを作成している場合、気になるエリアから外れていることに気付いたときにレコグナイザー内部から-ignoreTouch:withEvent:
を呼び出すことで簡単にこれを行うことができます。
標準のパン認識機能とタッチ開始 OKを使用しているため(デリゲート関数でそれを防止したくない場合)、実際に受け取るのは区別することだけです。認識エンジンのターゲットアクション。 translationInView:
またはlocationInView:
の戻り値のY値を確認し、適切にクランプします。