3

私のジェスチャ認識コードは、iOS 4.2 では正常に機能しましたが、iOS 4.3 では機能しません。iOS 4.2 から 4.3 へのジェスチャ認識エンジンの文書化された変更は見つかりませんが、iPad とシミュレーターの両方でコードが機能しなくなったことを確認しました。

これは私がやっていることです:

ビュー コントローラーの ViewDidLoad メソッドに、次のように記述します。

UISwipeGestureRecognizer *swipeUpGesture = [[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipedScreenLeft:)] autorelease];
swipeUpGesture.numberOfTouchesRequired = 2;
swipeUpGesture.direction = (UISwipeGestureRecognizerDirectionLeft);
[scrollView addGestureRecognizer:swipeUpGesture];

iOS 4.2 ではこれは期待どおりに機能しますが、iOS 4.3 では 2 本の指でスワイプしても swipedScreenLeft は呼び出されません。すべてがコンパイルされて実行されますが、エラーや警告は発生しません。

このジェスチャ レコグナイザが iOS 4.2 では問題なく動作する場合でも、iOS 4.3 では動作しなくなる可能性があるものはありますか?

また、iOS 4.2 では 2 本の指で画面に触れても正しいジェスチャを行わないと何も起こらないことに気付きましたが、iOS 4.3 では 2 本の指で画面に触れても、1 本の指だけで触れているかのように動作します。指。iOS 4.3 がアプリのマルチタッチ イベントを認識しないようです。

別の注意: 私の tapGestureRecognizer は iOS 4.3 で正常に動作しますが、動作しないのは swipeGestureRecognizer だけです。

4

3 に答える 3

8

問題は UIScrollView のみにあり、私もそれについて激怒しました: http://i.stack.imgur.com/dqx3d.png

[更新 1] ここで解決策:

状況: UIViewController のビューには、サブビューとして UIScrollView があります (スクロール ビューのページングが無効になっています)。

ジェスチャーを UIView にアタッチするために使用するコード:

UISwipeGestureRecognizer *swipeLeftRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipedScreenLeft:)];
[swipeLeftRecognizer setNumberOfTouchesRequired:2.0f];
swipeLeftRecognizer.delegate = self;
[swipeLeftRecognizer setDirection:UISwipeGestureRecognizerDirectionLeft];

[self.view addGestureRecognizer:swipeLeftRecognizer];

[swipeLeftRecognizer release];

iOS 4.3 を有効にするには、UIViewController をUIGestureRecognizerDelegate

次に、次のデリゲート メソッドを使用して、scrollView の panGesture とビューのスワイプ 1 を同時に認識できるようにしました。ここにコード:

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

    if ([gestureRecognizer isKindOfClass:[UISwipeGestureRecognizer class]] && [otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
        return YES;
    }

    return NO;

}

[更新 2]

2 本の指で UIScrollView のパンを無効にするには、UISCrollView クラスのカスタム サブクラスである scrollview を作成し、panGesture 検出器の動作を変更する必要があると思いますが、それをしようとはしませんでした。代わりに、怠惰なソリューションを選択しました。基本的には、UISwipeGestureRecognizer の現在の状態に基づいて scrollView スクロール機能を有効/無効にします。さらに、反対方向へのダブルタッチの動きも防止するために、別の認識機能を追加しました。

スワイプ検出器用に 2 つのプロパティを作成する必要があります。

@property (nonatomic,assign) UISwipeGestureRecognizer *swipeRightRecognizer;
@property (nonatomic,assign) UISwipeGestureRecognizer *swipeLeftRecognizer;

次に、次のようにコーディングしました。

[self setSwipeRightRecognizer:[[UISwipeGestureRecognizer alloc] initWithTarget:nil action:nil]];
[swipeRightRecognizer setNumberOfTouchesRequired:2.0f];
swipeRightRecognizer.delegate = self;
[swipeRightRecognizer setDirection:UISwipeGestureRecognizerDirectionRight];
[self addObserver:self forKeyPath:@"swipeRightRecognizer.state" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:NULL];
[self.view addGestureRecognizer:swipeRightRecognizer];
[swipeRightRecognizer release];

[self setSwipeLeftRecognizer:[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipedScreenLeft:)]];
[swipeLeftRecognizer setNumberOfTouchesRequired:2.0f];
swipeLeftRecognizer.delegate = self;
[swipeLeftRecognizer setDirection:UISwipeGestureRecognizerDirectionLeft];
[self addObserver:self forKeyPath:@"swipeLeftRecognizer.state" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:NULL];
[self.view addGestureRecognizer:swipeLeftRecognizer];
[swipeLeftRecognizer release];

次に、このメソッドを追加します。

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

    if (self.swipeRightRecognizer.state == UIGestureRecognizerStateFailed) {
        self.scrollView.scrollEnabled = YES;
        return;
    }

    if ([self.swipeRightRecognizer numberOfTouches] != 2.0f) {
        self.scrollView.scrollEnabled = YES;   
    }
    else{
        self.scrollView.scrollEnabled = NO;   
    }
}

そして、以前の「[UPDATE]」で投稿した既存のメソッドを更新します。

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

    if ([gestureRecognizer isKindOfClass:[UISwipeGestureRecognizer class]] && [otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
        if ([gestureRecognizer numberOfTouches] != 2.0f) {
            self.scrollView.scrollEnabled = YES;   
        }
        else{
            self.scrollView.scrollEnabled = NO;   
        }

        return YES;
    }
    return NO;
}

最後に、dealloc でオブザーバーを削除します。

[self removeObserver:self forKeyPath:@"swipeRightRecognizer.state"];
[self removeObserver:self forKeyPath:@"swipeLeftRecognizer.state"];

よりクリーンなソリューションがあるに違いありませんが、うまくいきます..

それが役に立てば幸い ;)

于 2011-03-15T15:08:39.970 に答える
1

UIImageView を使用していて、ダブルタップを処理したい場合は、ユーザー インタラクションを有効にする必要があります。私はこれを見つけるために多くの時間を無駄にしました。

于 2012-05-19T10:46:09.393 に答える
0

おそらく、私のコードがあなたの問題を解決するのに役立つでしょう。iOS 4.3 を搭載した iPad でコードをテストしましたが、完全に動作します

UISwipeGestureRecognizer *oSwipeLeft = [[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(mPreviousPage:) ] autorelease];
oSwipeLeft.numberOfTouchesRequired = 2;
oSwipeLeft.direction = UISwipeGestureRecognizerDirectionLeft;
[self.view addGestureRecognizer:oSwipeLeft];

UISwipeGestureRecognizer *oSwipeRight = [[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(mNextPage:) ] autorelease];
oSwipeRight.numberOfTouchesRequired = 2;
oSwipeRight.direction = UISwipeGestureRecognizerDirectionRight;
[self.view addGestureRecognizer:oSwipeRight];

UISwipeGestureRecognizer *oSwipeUp = [[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(mPreviousPage:) ] autorelease];
oSwipeUp.numberOfTouchesRequired = 2;
oSwipeUp.direction = UISwipeGestureRecognizerDirectionUp;
[self.view addGestureRecognizer:oSwipeUp];
于 2011-03-14T09:33:18.040 に答える