web-dev-qa-db-ja.com

UIScrollViewでスワイプジェスチャーを認識する方法

UIScrollViewの左/右スワイプジェスチャを認識しようとしています。私はUISwipeGestureRecognizersを作成してスクロールビューに関連付けようとしました。それは動作しますが、非常にまれです。ほとんどの場合、呼び出されません。どうして?

確実に左/右にスワイプして機能させるにはどうすればよいですか?ジェスチャレコグナイザを使用できますか、それともtouchesBegan/Endedで自分で処理する必要がありますか?

ありがとう

26
David

理解した。私の場合、UIScrollViewには、ズームを許可したUIImageが含まれていました。どうやらこれはスクロールが有効になっていて、UIScrollViewがスクロールとスワイプ(次の前の画像)を意図したジェスチャーを区別するのに問題があったことを意味していました。

私の場合の重要な点は、画像が拡大されていない場合はスクロールビューでのスクロールを無効にし、拡大されている場合は再度有効にすることです。これにより、期待どおりの動作が得られます。

重要なのは、スクロールビューのデリゲートに以下を配置することです。

- (void)scrollViewDidZoom:(UIScrollView *)scrollView {
  if (scrollView.zoomScale!=1.0) {
    // Zooming, enable scrolling
    scrollView.scrollEnabled = TRUE;
  } else {
    // Not zoomed, disable scrolling so gestures get used instead
    scrollView.scrollEnabled = FALSE;
  }
}

また、スクロールを無効にしてスクロールビューを初期化する必要があります。ズームを有効にするには、デリゲートコールで画像を提供するだけです。

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
  // Return the scroll view
  return myImage;
}

また、viewDidLoadでいくつかのパラメーターを設定して、ズームとセットアップのジェスチャー認識機能も設定します。

- (void)viewDidLoad {
  [super viewDidLoad];
  myScrollView.contentSize = CGSizeMake(myImage.frame.size.width, myImage.frame.size.height);
  myScrollView.maximumZoomScale = 4.0;
  myScrollView.minimumZoomScale = 1.0;
  myScrollView.clipsToBounds = YES;
  myScrollView.delegate = self;

  [myScrollView addSubview:myImage];
  [self setWantsFullScreenLayout:TRUE];

  myScrollView.scrollEnabled = FALSE; 
  UISwipeGestureRecognizer *recognizer = 
    [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
  recognizer.delaysTouchesBegan = TRUE;
  [myScrollView addGestureRecognizer:recognizer];
  [recognizer release];

  recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
  recognizer.direction = UISwipeGestureRecognizerDirectionLeft;
  [myScrollView addGestureRecognizer:recognizer];
  [recognizer release];
  [myScrollView delaysContentTouches];
}
42
David
UIScrollView *scrollView = ...
UISwipeGestureRecognizer *mySwipe = ...

この問題を修正する正しい解決策は、1行のコードを追加することです。

[scrollView.panGestureRecognizer requireGestureRecognizerToFail:mySwipe]

Swiftバージョン:

scrollView.panGestureRecognizer.requireGestureRecognizerToFail(mySwipe)

Swift4バージョン:

scrollView.panGestureRecognizer.require(toFail: mySwipe!);
29

良いポスト。

私は同じようなことをしていて(画像ビューなし)、contentSizeが高さよりも小さい場合はスクロールを無効にする必要がありました(スクロールビューは垂直方向にしかスクロールしません)。

if (scrollView.contentSize.height>scrollView.frame.size.height) {
    scrollView.scrollEnabled = YES;
}
else {
    scrollView.scrollEnabled = NO;
}

それは私のためのトリックをしました

4
echappy

スワイプジェスチャー認識機能をアニメーション化してカスタマイズしたい人のために。

UIScrollViewおよびUIGestureRecognizerデリゲートを使用できます。

 Class ViewController: UIViewController, UISCrollViewDelegate, UIGestureRecognizerDelegate { 


   override func viewDidLoad() {
    super.viewDidLoad()

    scrollView.delegate = self
    swipeLeft.delegate = self
    swipeRight.delegate = self

  }


  func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
    return true
  }

  func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
  }

  func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
    return scrollView.alwaysBounceHorizontal
  }


  func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {

    // Your custom animation at the end of scrolling.
  }
}
1
K4747Z