1

ユーザーが画面を指で押したときに、継続的なアクションを実行したい。これは現在正常に動作します。しかし、ユーザーが2本目の指で画面を押すと、UILongPressGestureRecognizerが最初のプレスをキャンセル/終了し、新しいプレスに従い始めます。これを行う最善の方法は何ですか?UILongPressGestureRecognizers2 つ必要で、1 つが発火したときにもう 1 つを設定する必要がありますか

enabled=NO;有効=はい;

またはよりクリーンな方法はありますか?

現在、 を 1 つだけ使用UILongPressGestureRecognizerすると、2 番目の指が画面に押し付けられると、そこにあることさえ知らないように動作します。

4

2 に答える 2

3

UILongPressGestureRecognizerタッチの最小数 (デフォルトでは 1 本の指) しか認識しておらず、後で別の指を置いてもあまり効果がありません。1 回のタッチが必要な実際の電話でこれを試すと、最初のタッチでレコグナイザーが状態 1 に遷移することがわかります。最初の指を横に動かすか、2 番目の指を押し下げると、状態 2 に遷移します。最初の指を持ち上げるタッチダウンすると、状態 3 に遷移し、ジェスチャが終了します。

UILongPressGestureRecognizer上記の最初のビューと同じビューに2 番目のビューを追加しましたが、これには最低 2 回のタッチが必要でした。そのようです:

    UILongPressGestureRecognizer *lpgr1 = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(lpgr1Method:)];
    UILongPressGestureRecognizer *lpgr2 = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(lpgr2Method:)];
    lpgr2.numberOfTouchesRequired = 2;
    [self.view addGestureRecognizer:lpgr1];
    [self.view addGestureRecognizer:lpgr2];
// ...
- (void)lpgr1Method:(UIGestureRecognizer *)gestureRecognizer {
    UIGestureRecognizerState state = gestureRecognizer.state;
    self.stateLabel.text = [NSString stringWithFormat:@"%d", (int)state];
}
- (void)lpgr2Method:(UIGestureRecognizer *)gestureRecognizer {
    UIGestureRecognizerState state = gestureRecognizer.state;
    self.stateLabel2.text = [NSString stringWithFormat:@"%d", (int)state];
}

最初に 1 本の指で触れたままにすると、lpgr1状態 1 になります。次に、2 本目の指で触れたままにしておくと、lpgr1状態 2lpgr2になります。まったく発火しません。

一度に 2 本の指で触れてそれを保持すると、lpgr2発火し、発火しlpgr1ません。

したがって、ビュー全体に 2 つの認識機能を追加するのは混乱を招くだけであり、どのようにプログラムしても、目的の結果が得られないように見えます。したがって、適切なアプローチは、 の独自のサブクラスを作成することUIGestureRecognizerです。

編集:私もこれを試しました:

lpgr2.delegate = self;
lpgr1.delegate = self;
// ...
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return true;
}

これにより、両方のレコグナイザーが同時に起動し、2 番目の指が触れたことを認識できます。ただし、lpgr1人差し指を離した時点で終了。私もあなたが望むようにこれを行うことができませんでした。サブクラスを書きたいのですが、別のところで注意が必要です。幸運を!

于 2012-12-23T10:08:07.707 に答える
-1

新しいジェスチャ認識クラスを作成しました。シンプルで、1~2回のタッチの連続アクションで問題なく動作します。

FCTwoTouchesRecognizer.h

#import <UIKit/UIKit.h>
@interface FCTwoTouchesRecognizer : UIGestureRecognizer
@end

FCTwoTouchesRecognizer.m

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

@implementation FCTwoTouchesRecognizer
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesBegan:touches withEvent:event];
    if ([touches count] > 2) //only 1 or 2 touches
    {
        self.state = UIGestureRecognizerStateFailed;
        return;
    }
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesMoved:touches withEvent:event];
    if (self.state == UIGestureRecognizerStateFailed) return;
    self.state = UIGestureRecognizerStateChanged;
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesEnded:touches withEvent:event];
    if ( (self.numberOfTouches - [touches count]) == 0 )
        self.state = UIGestureRecognizerStateRecognized;
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesCancelled:touches withEvent:event];
    self.state = UIGestureRecognizerStateFailed;
}
@end

使用法:

1) 追加

FCTwoTouchesRecognizer *recog = [[FCTwoTouchesRecognizer alloc] initWithTarget:self action:@selector(twoTouchesGestureHandler:)];
        [self addGestureRecognizer:recog];

2) ハンドル

-(void)twoTouchesGestureHandler:(FCTwoTouchesRecognizer *)recognizer
{
    if (recognizer.state == UIGestureRecognizerStateChanged)
    {
        NSLog(@"changed");
        if ([recognizer numberOfTouches] > 1)
        {
            CGPoint point1 = [recognizer locationOfTouch:0 inView:self];
            CGPoint point2 = [recognizer locationOfTouch:1 inView:self];
        }
        else
        {
            CGPoint point = [recognizer locationInView:self];
        }
    }

    if(recognizer.state == UIGestureRecognizerStateEnded)
    {
        NSLog(@"touches ended");
    }
}
于 2014-02-06T10:58:21.857 に答える