28

で左右のスワイプジェスチャーを認識しようとしていUIScrollViewます。UISwipeGestureRecognizersそれらを作成してスクロールビューに関連付けようとしました。それは機能しますが、非常にまれです。呼ばれないことがほとんどです。なんで?

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

ありがとう

4

4 に答える 4

42

理解した。私の場合、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];
}
于 2010-09-06T16:41:22.440 に答える
35
UIScrollView *scrollView = ...
UISwipeGestureRecognizer *mySwipe = ...

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

[scrollView.panGestureRecognizer requireGestureRecognizerToFail:mySwipe]

迅速なバージョン:

scrollView.panGestureRecognizer.requireGestureRecognizerToFail(mySwipe)

Swift4 バージョン:

scrollView.panGestureRecognizer.require(toFail: mySwipe!);
于 2015-01-27T22:22:24.410 に答える
4

良い投稿。

私は同様のこと(画像ビューなし)を行っていました.contentSizeが高さよりも小さい場合、基本的にスクロールを無効にする必要がありました(スクロールビューは垂直方向にのみスクロールします)。

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

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

于 2010-09-30T02:00:59.757 に答える