2012-10-02 11 views
8

水平スクロールではスクロールをスクロールするが、垂直スクロールではスクロールするUIScrollViewを実装しようとしています。今私は垂直スクロールを無効にしている画像をスクロールするだけでうまく動作するUIScrollViewを持っていますが、垂直パンを傍受し、垂直パンの代わりに自分のメソッドを呼び出す方法を見つけようとしています。スクロールビュー私はやることができた垂直パンジェスチャーを使用した水平スクロールUIScrollView

私に私handlePanGestureでパンを完全に制御できます
UIPanGestureRecognizer *panUp = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)]; 
[self.scrollView addGestureRecognizer:panUp]; 
[scrollView.panGestureRecognizer setEnabled:NO]; 

:メソッドを、その後私は、私は基本的にすべてのスクロールロジックを書き換えることするつもりのように感じるので、これは特に有用されていません私は避けようとしている。どのようにこれを達成するための助けや指導は非常に高く評価されるでしょう。

ありがとうございます!

+0

のためのより良い方法を持っているように見えますか?それはスクロールを伴うかどうか? – rdelmar

+0

スクロールは必要ありません。私は、スクロールビューの同じ親ビューにアニメーション化したいサブビューを持っています(スクロールビューはその親ビューの一部を占有します) – lramirez135

+0

次に、私はあなたの声明を理解しません:「私は本質的にすべてのスクロールロジックを書き換えます "。水平パンは正しく動作しますか? panUpはまだscrollViewによって傍受されていますか? – rdelmar

答えて

4

スクロールビューでこれらのジェスチャーを使用しているため、パンジェスチャーを使用したい場合、これは難しいと思います。しかし、スワイプを使うことができれば、実装は簡単です。

UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)]; 
    swipe.direction = UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionUp; 
    [self.scrollView addGestureRecognizer:swipe]; 

私はこれをテストし、それがハンドラを呼び出すためにうまく働いた、とあなたは(私のテストでは、スクロールビューは十分な高と十分なコンテンツが短かったスクロールビューのパンジェスチャー認識を無効にする必要はありませんそれは垂直スクロールがなかったことです - これが必要かどうかわかりません)。

+1

お世話になりました。これは完璧に働き、パンを稼働させるのにもっと夢中になることから私を救った。私はそれが画面上の遅いドラッグに応答しないと思ったのでスワイプの使用を避けていましたが、遅いスワイプでもうまくいきました。再度、感謝します。 – lramirez135

+0

役に立たない。自分でスワイプジェスチャーを試しましたか?それを扱うには十分なカスタマイズができません。 –

10

iOS 5以降、UIScrollViewexposes its UIPanGestureRecognizer。カスタムスワイプのdelegateselfに設定し、gestureRecognizerをプロパティまたはivarにして、クラスを<UIGestureRecognizerDelegate>プロトコルに準拠させます。次に、そのようUIGestureRecognizerDelegate– gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:を実装:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    if ([gestureRecognizer isEqual:self.swipe] && [otherGestureRecognizer isEqual:self.scrollView.panGestureRecognizer]) 
    { 
     return NO; 
    } 
    return YES; // the default for this method 
} 
+0

私はこの答えが好きです。なぜなら、単純なスワイプではなく、パンのジェスチャーでより多くのコントロールを私の手に加えているからです。サイドツーサイドのパンジェスチャーと同時に動作する私のuitableviewに関する問題がありました。これで解決しました。 – Bastek

+0

動作しません! 'otherGestureRecognizer'は' UIScrollViewDelayedTouchesBeganGestureRecognizer'であり、もちろん 'self.scrollView.panGestureRecognizer'と同じではありません。 –

+0

このメソッドはジェスチャーレコグナイザーと同時に認識する必要があるすべてのジェスチャーレコグナイザーに対して呼び出されます。 –

9

私はこのようなセットアップgestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:その後、UIPanGestureRecognizerを追加しました:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
    if ([gestureRecognizer isEqual:self.panGesture] && [otherGestureRecognizer isEqual:self.collectionView.panGestureRecognizer]){ 
     return YES; 
    } 
    return NO; 
} 

私はまた、唯一のgestureRecognizerShouldBegin:

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { 
    if ([gestureRecognizer isEqual:self.panGesture]) { 
     if (gestureRecognizer.numberOfTouches > 0) { 
      CGPoint point = [gestureRecognizer locationOfTouch:0 inView:gestureRecognizer.view]; 
      CGFloat distX = abs(self.collectionView.lastTouchPos.x - point.x); 
      CGFloat distY = abs(self.collectionView.lastTouchPos.y - point.y); 
      if (distX > distY) { 
       return NO; 
      } 
     } else { 
      return NO; 
     } 
    } 
    return YES; 
} 

にチェックを追加しましたパンを上または下に移動するときは、self.panGestureを使用します。

アップデートは

https://stackoverflow.com/a/8603839/667834は、それはあなたがあなたの垂直パンをどうしようとしているのは何gestureRecognizerShouldBegin

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { 
    if ([gestureRecognizer isEqual:self.panGesture]) { 
     if (gestureRecognizer.numberOfTouches > 0) { 
      CGPoint translation = [self.panGesture velocityInView:self.collectionView]; 
      return fabs(translation.y) > fabs(translation.x); 
     } else { 
      return NO; 
     } 
    } 
    return YES; 
} 
+0

ソリューションのおかげで –

+1

fabs(translation.y) SeanR

+1

が必要な場合を除き、私のために働きました –

関連する問題