Как распознать жест смахивания в UIScrollView - PullRequest
24 голосов
/ 06 сентября 2010

Я пытаюсь распознать жест влево / вправо в UIScrollView.Я попытался создать UISwipeGestureRecognizers и связать их с представлением прокрутки.Это работает, но очень редко.Большую часть времени мне не звонят.Почему?

Как мне надежно заставить работать пальцем влево / вправо на работу?Могу ли я использовать распознаватели жестов или я должен как-то сам справиться с этим в touchesBegan/Ended

Спасибо

Ответы [ 3 ]

41 голосов
/ 06 сентября 2010

Разобрался.В моем случае мой 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];
}
29 голосов
/ 28 января 2015
UIScrollView *scrollView = ...
UISwipeGestureRecognizer *mySwipe = ...

Правильное решение для устранения этой проблемы - добавить одну строку кода:

[scrollView.panGestureRecognizer requireGestureRecognizerToFail:mySwipe]

Swift версия:

scrollView.panGestureRecognizer.requireGestureRecognizerToFail(mySwipe)

Swift4 версия:

scrollView.panGestureRecognizer.require(toFail: mySwipe!);
4 голосов
/ 30 сентября 2010

Хороший пост.

Я делал похожую вещь (без просмотра изображений), и мне пришлось отключить прокрутку, если contentSize был меньше высоты (мой вид прокрутки прокручивал только по вертикали).

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

Это помогло мне

...