如何识别UIScrollView中的滑动手势

Dav*_*vid 25 iphone uiscrollview gesture swipe

我正在尝试识别左/右滑动手势UIScrollView.我试图创建UISwipeGestureRecognizers并将它们与滚动视图相关联.它的工作原理很少见.大部分时间我都没有被召唤.为什么?

如何可靠地左/右滑动工作?我可以使用手势识别器,还是我必须以某种方式处理它touchesBegan/Ended

谢谢

Dav*_*vid 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

我还必须在禁用滚动的情况下初始化滚动视图.要启用缩放,只需在委托调用上提供图像,

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
  // Return the scroll view
  return myImage;
}
Run Code Online (Sandbox Code Playgroud)

并在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];
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*kov 29

UIScrollView *scrollView = ...
UISwipeGestureRecognizer *mySwipe = ...
Run Code Online (Sandbox Code Playgroud)

解决此问题的正确解决方案是添加一行代码:

[scrollView.panGestureRecognizer requireGestureRecognizerToFail:mySwipe]
Run Code Online (Sandbox Code Playgroud)

Swift版本:

scrollView.panGestureRecognizer.requireGestureRecognizerToFail(mySwipe)
Run Code Online (Sandbox Code Playgroud)

Swift4版本:

scrollView.panGestureRecognizer.require(toFail: mySwipe!);
Run Code Online (Sandbox Code Playgroud)