2012-08-08 8 views
6

私はこれについてたくさんの質問を読んだが、私が探しているものを達成するようなものはない...だから、私はUIViewControllerの中に任意のUIWebViewがあると言うことができる。 UIViewControllerには正常に動作するSwipeGestureRecognizerがあります。スクロールバーがない場合でも、UIWebView内で動作します。 (ページをロードする前、またはUIWebViewのサイズ内に適切に収まるページをロードしても)。ただし、水平スクロールが必要なWebページを左または右にロードすると、ビュー内のUIWebView部分にスワイプジェスチャーが認識されません。クリック/ドラッグ/スワイプするたびにスクロールアクションが開始されます。 「スワイプ」と指でスクロールする(スクロールするのではなく、スクロールする)ことを区別する方法はありますか?UIWebView内のスワイプジェスチャ認識

答えて

2

UIWebViewをサブクラス化し、ジェスチャ認識者の呼び出しを無効にする必要があります。

EDIT - この記事Handling touches inside UIWebviewを見て、このリンクhttp://mithin.in/2009/08/26/detecting-taps-and-events-on-uiwebview-the-right-way/

+2

これについてどうやって説明してください。ドキュメントでは、 "UIWebViewクラスはサブクラス化されるべきではありません"と書かれています。 http://developer.apple.com/library/ios/#documentation/uikit/reference/UIWebView_Class/Reference/Reference.html – MrHappyAsthma

+0

編集 –

24

はい、あなたはあなた自身のUISwipeGestureRecognizerが失敗したときにそのUIPanGestureRecognizerにのみ発動する必要があることのUIWebViewのUIScrollViewのを伝えることができます。

これは、あなたがそれを行う方法です:あなたのためにトリックを行う必要があります

UISwipeGestureRecognizer *rightSwipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeGesture:)]; 
UISwipeGestureRecognizer *leftSwipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeGesture:)]; 
rightSwipeGesture.direction = UISwipeGestureRecognizerDirectionRight; 
leftSwipeGesture.direction = UISwipeGestureRecognizerDirectionLeft; 
[self.view addGestureRecognizer:rightSwipeGesture]; 
[self.view addGestureRecognizer:leftSwipeGesture]; 

[_webView.scrollView.panGestureRecognizer requireGestureRecognizerToFail:rightSwipeGesture]; 
[_webView.scrollView.panGestureRecognizer requireGestureRecognizerToFail:leftSwipeGesture]; 

+1

をご覧ください。 –

+1

天才、私の多くの時間を節約! –

+1

これはテストしていませんが、UIWebviewのデフォルトのスクロールを上書きすると思います。これは正しい? –

1

Johannes Fahrenkrug's answerは、WebViewの組み込みパンジェスチャを条件付きでブロックすることに成功しました。しかし、これは、WebViewのパンジェスチャーが非常に遅い場合にのみ機能することが判明しました。私が任意の合理的なスピードでWebViewをパンすると、スワイプジェスチャーがトリガーされました。私はスワイプのジェスチャーを起動するための高速スワイプと、デフォルトのWebViewスクロール機能を使用する中程度または遅いパンだけを必要としていました。

UISwipeGestureRecognizerは、スワイプの速度をカスタマイズするためのプロパティがありません、とUIPanGestureRecognizerは、速度特性が、必要な速度を設定する方法はありませんを持っているので、私はthis tutorialに基づいてカスタムジェスチャー認識の設定:

をFastSwipeGestureRecognizer.h

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

#define REQUIRED_TOUCHES 5 
#define REQUIRED_STRAIGHTNESS 3 
#define REQUIRED_TIME .1 

typedef enum { 
    DirectionUp = 0, 
    DirectionRight, 
    DirectionDown, 
    DirectionLeft 
} Direction; 

@interface FastSwipeGestureRecognizer : UIGestureRecognizer { 
    CGPoint firstTouchLocation; 
    NSTimeInterval firstTouchTime; 
    int touchesCount; 

    Direction direction; 
} 

@property (nonatomic) CGPoint firstTouchLocation; 
@property (nonatomic) NSTimeInterval firstTouchTime; 
@property (nonatomic) int touchesCount; 

@property (nonatomic) Direction direction; 

@end 

FastSwipeGestureRecognizer.m

そして、受け取ったジェスチャー

- (void)handleSwipeGesture:(FastSwipeGestureRecognizer *)gesture { 
    if (gesture.state == UIGestureRecognizerStateEnded) { 
     if (gesture.direction == DirectionRight) { 
      // do something 
     } else if (gesture.direction == DirectionLeft) { 
      // do something 
     } else if (gesture.direction == DirectionUp) { 
      // do something 
     } else if (gesture.direction == DirectionDown) { 
      // do something 
     } 
    } 
} 

これが唯一の4つのすべてのスワイプ方向を処理するために1つのジェスチャーを必要とすることに注意してください、代わりの方向を検出し、あなたのジェスチャー

FastSwipeGestureRecognizer *swipeGesture = [[FastSwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeGesture:)]; 
[self.view addGestureRecognizer:swipeGesture]; 
[self.webView.scrollView.panGestureRecognizer requireGestureRecognizerToFail:swipeGesture]; 

を設定

1方向につき1つのUISwipeGestureRecognizer。

関連する問題