Подтвердить что ты не робот

Как распознать жест жестов в UIScrollView

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

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

Спасибо

4b9b3361

Ответ 1

Выяснил это. В моем случае мой UIScrollView содержал UIImage, который я разрешил масштабирование. По-видимому, это означало, что прокрутка включена, и UIScrollView испытывает трудности с различием жестов, предназначенных для прокрутки vs swipe (следующее, предыдущее изображение).

Ключ в моем случае - отключить прокрутку в прокрутке, когда изображение не увеличено, и переименовать его при его увеличении. Это обеспечивает ожидаемое поведение.

Критическая часть состоит в том, чтобы поместить в делегат просмотра прокрутки следующее:

- (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];
}

Ответ 2

UIScrollView *scrollView = ...
UISwipeGestureRecognizer *mySwipe = ...

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

[scrollView.panGestureRecognizer requireGestureRecognizerToFail:mySwipe]

Swift версия:

scrollView.panGestureRecognizer.requireGestureRecognizerToFail(mySwipe)

Версия Swift4:

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

Ответ 3

Хорошая почта.

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

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

Это помогло

Ответ 4

Для тех, кто хочет анимировать и настраивать свои распознаватели жестов.

Мы можем использовать делегаты 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.
  }
}